Linux 执行shell脚本与在ubuntu 12.04中使用sh命令直接不同

Linux 执行shell脚本与在ubuntu 12.04中使用sh命令直接不同,linux,bash,shell,ubuntu,Linux,Bash,Shell,Ubuntu,尝试使用简单脚本测试命令是否存在 $ cat test.sh command -v nwef echo $? $ sh test.sh 127 $ ./test.sh 1 $ bash test.sh 1 在centos 6.5中,结果始终为1 有人知道为什么“sh test.sh”不同吗 sh在Ubuntu中是dash,而不是bash。退出状态的区别在于您对命令的使用以及bash和dash如何区别对待它们 在man bash的中: 。。。 如果提供了-V或-V选项,则如果找到命令,则退出状

尝试使用简单脚本测试命令是否存在

$ cat test.sh
command -v nwef
echo $?

$ sh test.sh
127
$ ./test.sh
1
$ bash test.sh
1
在centos 6.5中,结果始终为1


有人知道为什么“sh test.sh”不同吗

sh
在Ubuntu中是dash,而不是bash。

退出状态的区别在于您对
命令的使用以及bash和dash如何区别对待它们

在man bash的

。。。 如果提供了-V或-V选项,则如果找到命令,则退出状态为0,如果未找到命令,则退出状态为1。如果 未提供任何选项,并且出现错误或找不到命令,退出状态为127。否则,内置命令的退出状态为命令的退出状态

这就是为什么Bash会出现
exit 1

由于Dash不像Bash那样处理
命令中的
-v
选项,因此它将
nwef
视为“未找到命令”,即
退出127


我认为在这里还需要注意Debian是如何区别对待
/test.sh
sh test.sh
的。因为脚本不包含像
#这样的解释器的shebang路径/bin/sh
,运行
/test.sh
默认为
#/bin/bash
而不是
#/bin/sh
并使用
退出1
处理您对
命令的使用。不幸的是,我在文档中找不到对此的解释。

检查什么是sh。我猜debian派生系统有一个奇怪的怪兽,比如
/bin/ash
/bin/sash
,作为“基本shell”。如果是,那么您应该检查
命令
行为,我不知道它做了什么
命令
内置也包含在Dash中,我认为它只是没有像Bash那样对待
-v
选项。后更新。
  command [-pVv] command [arg ...]