哪个 bash 正在执行?

Ass*_*lov 5 shell bash

我想我已经将 bash 配置为 shell,但为什么会发生这种情况?

我的外壳是 bash:

# ls -al `which sh`
  lrwxrwxrwx 1 root root 4 Jul 12 03:25 /bin/sh -> bash 
Run Code Online (Sandbox Code Playgroud)

使用 sh 执行脚本时出错

# sh ubuntu/util.sh
  ubuntu/util.sh: line 32: `test-build-release': not a valid identifier
Run Code Online (Sandbox Code Playgroud)

bash 没有错误

# bash ubuntu/util.sh
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 14

它正在运行您期望的 bash 可执行文件,但您的 shell 不仅仅是 bash;它是在 POSIXsh兼容模式下运行的 bash 。它通过查看它被调用的命令名称来做到这一点,如果是sh,那么它会自动激活 POSIX 模式。它在这方面做得非常糟糕,不应该完全依赖于测试 POSIXsh兼容脚本,但它应该大大限制允许的语法。

--posix

更改 bash 的行为,其中默认操作不同于 POSIX 标准以匹配标准(posix 模式)。有关详细介绍 posix 模式如何影响 bash 行为的文档,请参阅下面的另请参见。

来自http://tiswww.case.edu/php/chet/bash/POSIX

使用--posix命令行选项启动 Bash或set -o posix在 Bash 运行时执行将通过更改行为以匹配 POSIX 在 Bash 默认值不同的区域中指定的行为,从而使 Bash 更符合 POSIX 标准。

当作为 调用时sh,Bash 在读取启动文件后进入 POSIX 模式。

  • 我必须补充一点,我觉得这很有趣......因为它可能就像我说的“不应该完全依赖于测试 POSIX”......你的脚本的作者可能只用 bash 测试,而不是 sh,而不是与您使用的版本相同。:) (2认同)
  • @AssenKolov **问题:** 虽然函数中使用的 "-" 对 bash 很好,但不适用于 sh,见第 32 行 (2认同)