为什么我会在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
我有两个问题:
-
如果我写了一个指定shell的shabang行,不管是否使用
sh file.sh
或bash file.sh
,它不应该用bash运行吗? -
据我所知,
$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
)