sudo 使用什么 shell

2024-03-22

我很抱歉,因为这一定是其他人问过的问题,但这似乎是谷歌证明。我试图弄清楚正在调用什么 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确实如此。

I (now)我知道[[是 bash 特定的,但尽管有响应,但 sudo 的默认 shell 似乎并不是 bash。


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

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

sudo echo $0

该命令具有误导性,因为$0被你的 shell 扩展before sudo叫做。它正在打印您当前的$0,不是值$0在 - 的里面sudo倒是环境。

我们来比较一些命令:

  • sudo ls

    这将执行/bin/ls直接可执行。不涉及外壳。以下命令将显示区别何时发挥作用。

  • sudo ls /root/*

    当前的 shell 扩展了 glob。如果您无法访问/root/那么 glob 不会扩展,你会得到ls: cannot access /root/*: No such file or directory.

  • sudo 'ls /root/*'

    这尝试执行一个名为ls /root/*。从字面上看,它的名字是* in the 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/*命令行,扩展全局。这个终于可以工作了,因为我们有一个显式的 shell 来扩展 glob,并且我们正在内部进行扩展sudo而不是在它之外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sudo 使用什么 shell 的相关文章

随机推荐