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.
我很抱歉,因为这一定是其他人问过的问题,但它似乎 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.