为什么我会在sh和bash的情况下获得不同的输出?

我有以下简单的脚本:

#!/bin/bash echo "Bash version ${BASH_VERSION}..." for i in {1..99..2} do echo $i done 

我用sh file.sh运行时的输出:

 Bash version ... {1..99..2} 

在我使用bash file.sh运行的情况下的输出:

 Bash version 4.2.25(1)-release... 1 3 5 . . . 99 

我有两个问题:

  1. 如果我写了一个指定shell的shabang行,不管是否使用sh file.shbash file.sh ,它不应该用bash运行吗?

  2. 据我所知, $BASH_VERSION不被sh识别,但for循环有什么问题? 为什么不打印数字?

sh ,伯恩贝壳,已经老了 。 它的行为由POSIX标准指定。 如果你想要新的行为,你可以使用bash ,Bourne Again shell,它会一直添加新的function。 在许多系统上, sh只是bash ,而bash在该名称下运行时会打开兼容模式。 在Ubuntu上, sh是破坏性的Almquist shell。

支撑扩展是一个相对较新的function ,也不适用于较旧的支架。 它当然不应该是sh

只有将脚本作为可执行文件调用时,才会尊重shebang行:

 ./myscript.sh 

我可以给任何一个shebang脚本,并通过运行以下命令在Python中打开它:

 python myscript.sh 

在Unix和Linux上看到这些优秀的问题:

  • shebang是否确定运行脚本的shell?
  • 执行shell脚本的不同方法

SH是愚蠢的。 它无能为力。

它只知道最基本的命令。 它没有做任何其他事情。

它无法将{1..99}理解为数值。 它将它理解为一个字符串。

SH / Dash未开发。 这是DIRE情况的紧急提示(在交互模式下。否则,对于脚本来说这是一件非常好的事情。)。

建议使用Bash,因为它可以完成SH所能做的一切,以及最新的定制和强大function。

回答#1, #! 只有在直接调用程序时才会解析。 (如,./ ./program.sh