![哪个 bash 正在执行?](https://linux22.com/image/90302/%E5%93%AA%E4%B8%AA%20bash%20%E6%AD%A3%E5%9C%A8%E6%89%A7%E8%A1%8C%EF%BC%9F.png)
我想我已经将 bash 配置为 shell,但为什么会发生这种情况?
我的 shell 是 bash:
# ls -al `which sh`
lrwxrwxrwx 1 root root 4 Jul 12 03:25 /bin/sh -> bash
使用 sh 执行脚本时出错
# sh ubuntu/util.sh
ubuntu/util.sh: line 32: `test-build-release': not a valid identifier
bash 没有错误
# bash ubuntu/util.sh
答案1
它正在运行您期望的 bash 可执行文件,但您的 shell 不仅仅是 bash;它是在 POSIXsh
兼容模式下运行的 bash 。它通过查看调用它的命令名称来实现这一点,如果是sh
,那么它会自动激活 POSIX 模式。它在这方面做得非常糟糕,不应该完全依赖它来测试 POSIXsh
兼容脚本,但它应该大大限制允许的语法。
--posix
更改默认操作与 POSIX 标准不同的 bash 行为以匹配标准(posix 模式)。请参阅下面的文档参考,该文档详细介绍了 posix 模式如何影响 bash 的行为。
并从http://tiswww.case.edu/php/chet/bash/POSIX:
--posix
使用命令行选项启动 Bash或set -o posix
在 Bash 运行时执行将导致 Bash 更接近 POSIX 标准,方法是更改行为以匹配 POSIX 在 Bash 默认值不同的区域中指定的行为。当作为 调用时
sh
,Bash 在读取启动文件后进入 POSIX 模式。