shell sudo 有什么用

What shell does sudo use

我很抱歉,因为这一定是其他人问过的问题,但它似乎 google 证明了。我试图找出 shell 被调用的内容,因为我遇到了不一致的情况。如果我 sudo,我的脚本就不起作用,但如果我 sudo bash,我的脚本就起作用。然而,当我 sudo echo [=14=] 时,它显示 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 行 #!/bin/bash

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

sudo echo [=10=]

由于 [=18=]sudo 被调用 之前被您的 shell 扩展,因此该命令具有误导性。它正在打印您当前的 [=18=],而不是 sudo 环境中 [=18=] 的值。

让我们比较一些命令:

  • 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/* 的程序。从字面上看,它在 ls root 子目录中被命名为 *ls,尾随 space)。 sudo: ls /root/*: command not found.

  • 失败
  • sudo ls '/root/*'
    

    This 运行s /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 内而不是在它之外进行扩展。

通过解决 post 的标题所暗示的更普遍的问题来补充 John Kugelman's helpful answer

附带说明:最好始终以 shebang 行开始您的脚本,以明确控制 shell 它是 运行 的内容。

sudo 默认情况下 运行 不是 shell ,但可以 运行以下选项之一:

  • -s (non-login shell)
  • -i(登录shell)

至于什么 shell被使用:man表示-s(类似于-i;强调我的):

Run the shell specified by the SHELL environment variable if it is set or the shell specified by the invoking user's password database entry. If a command is specified, it is passed to the shell for execution via the shell's -c option. If no command is specified, an interactive shell is executed.

换句话说:sudo 使用 current 用户的默认 shell.