我很抱歉,因为这一定是其他人问过的问题,但这似乎是谷歌证明。我试图弄清楚正在调用什么 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(使用前将#替换为@)