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