[英]What shell does sudo use
我道歉,因为这必须是其他人提出的问题,但似乎谷歌证明。 我正在试图弄清楚调用了什么shell,因为我遇到了一个不一致的问题。 如果我sudo
我的脚本不起作用,但如果我sudo bash
确实有效。 然而,当我sudo echo $0
,它说bash。
cpu=$(cat /proc/cpuinfo | grep Revision | cut -d' ' -f 2-);
if [[ "a22082" = $cpu || "a02082" = $cpu ]]; then
echo 'do stuff';
fi
如果我用#!/ bin / sh指定命令解释器,它仍然会失败,但更具体的是#!/ bin / bash 。
我(现在)知道[[
bash具体但是尽管响应它似乎不像sudo的默认shell是bash。
简短回答:没有默认解释器。 你的脚本需要一个shebang line #!/bin/bash
在顶部。
答案很长: sudo
没有运行shell。 它运行您直接传递的命令,没有中间shell。 如果你想要一个shell,你需要明确地传递它。
sudo echo $0
此命令具有误导性,因为在调用sudo
之前 ,shell会扩展$0
。 它打印当前的$0
,而不是价值$0
内部sudo
“d环境。
让我们比较一些命令:
sudo ls
这直接执行/bin/ls
可执行文件。 没有涉及shell。 当区别发挥作用时,将显示以下命令。
sudo ls /root/*
当前的shell扩展了glob。 如果你不能访问/root/
那么glob没有扩展,你得到ls: cannot access /root/*: No such file or directory
。
sudo 'ls /root/*'
这会尝试执行名为ls /root/*
。 从字面上看,它的命名*
在root
的子目录ls
( ls
后面有个空格)。 它失败了sudo: ls /root/*: command not found
。
sudo ls '/root/*'
这运行/bin/ls
并传递文字字符串/root/*
。 没有全球扩张。 它失败了ls: cannot access /root/*: No such file or directory
。
sudo bash -c 'ls /root/*'
这执行/bin/bash
并使其插入ls /root/*
命令行,扩展glob。 最后,这个有效,因为我们有一个显式的shell来扩展glob,我们在sudo
进行扩展而不是在它之外。
通过解决帖子标题隐含的更一般性问题来补充John Kugelman的有用答案 :
旁注:最好始终使用shebang行启动脚本,以明确控制运行它的shell。
sudo
默认情况下不运行shell,但可以使用以下任一选项运行一个:
-s
(非登录shell) -i
(登录shell) 至于什么外壳使用: man
的状态-s
(适用类似-i
;重点煤矿):
运行SHELL环境变量指定的shell(如果已设置)或由调用用户的密码数据库条目指定的shell。 如果指定了一个命令,它将通过shell的-c选项传递给shell执行。 如果未指定任何命令,则执行交互式shell。
换句话说: sudo
使用当前用户的默认shell。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.