sudo使用什么shell

时间:2016-06-14 16:39:19

标签: linux bash shell sudo

我道歉,因为这必须是其他人提出的问题,但似乎谷歌证明。我试图找出正在调用的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。

2 个答案:

答案 0 :(得分:8)

简答:没有默认解释器。您的脚本顶部需要一个shebang行#!/bin/bash

答案很长: sudo没有运行shell。它运行您直接传递的命令,没有中间shell。如果你想要一个shell,你需要明确地传递它。

sudo echo $0

由于$0在调用sudo 之前由{em>>扩展$0,因此该命令具有误导性。它会在$0 d环境中打印您当前的sudo,而不是sudo ls的值。

让我们比较一些命令:

  • /bin/ls

    直接执行sudo ls /root/*可执行文件。没有涉及shell。当区别发挥作用时,将显示以下命令。

  • /root/

    当前的shell扩展了glob。如果您无法访问ls: cannot access /root/*: No such file or directory,则不会展开glob,而是获得sudo 'ls /root/*'

  • ls /root/*

    这会尝试执行名为*的程序。从字面上看,它在root的{​​{1}}子目录中命名为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而不是在它之外进行扩展。

答案 1 :(得分:3)

通过解决帖子标题隐含的更一般性问题补充John Kugelman's helpful answer

旁注:最好始终使用shebang行启动脚本,以明确控制运行它的shell。

sudo默认情况下不运行shell ,但可以使用以下任一选项运行一个:

  • -s(非登录shell)
  • -i(登录shell)

至于使用了什么 shell:man的{​​{1}}州(类似于-s;强调我的):

  

运行SHELL环境变量指定的 shell(如果已设置)或由调用用户的密码数据库条目指定的shell。如果指定了一个命令,它将通过shell的-c选项传递给shell执行。如果未指定任何命令,则执行交互式shell。

换句话说: -i使用当前用户的默认shell。