繁体   English   中英

sudo使用什么shell

[英]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的子目录lsls后面有个空格)。 它失败了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM