bash脚本调用显示不一致的行为

时间:2016-02-08 10:21:38

标签: linux bash shell

我在bash中编写了一个测试脚本(我们称之为test.sh)。并且脚本的开头具有以下声明:

#!/bin/bash -e

后面是一些代码。

现在,当我将其bash test.sh./test.sh调用时,它会显示不同的结果。这怎么可能。我认为默认情况下./test.sh从脚本的第一行读取默认shell并使用它调用它。我的理解是否正确。

1 个答案:

答案 0 :(得分:2)

#!/bin/bash -e shebang仅在您(尝试)执行文件(不是二进制可执行文件)作为命令时使用。该行通知内核应该使用哪个可执行文件来解释脚本中的代码。有关详细信息,请参阅shebang Wikipedia article

当您运行./test.sh时,您当前的shell将使用-e选项启动一个新的Bash子进程,并且此新进程是执行脚本文件中的命令的进程。

当你运行bash test.sh时,你明确地启动了一个新的Bash子流程(这次没有-e选项),它开始执行文件中的命令。当它遇到第一行中的shebang时,它只会将其视为与#开头的任何其他评论相同。 (如果你使用source . test.sh文件,那么shebang也会被忽略,只是另一条评论。

为确保Bash shell以某种方式运行,最好使用set内置而不是在调用Bash时提供选项。例如,为了确保在命令返回非零状态时shell退出,您应该在脚本开头或附近包含set -e

有关如何使用Linux内核执行命令的更深入信息,请参阅this answer运行“bash script.sh”和“./script.sh”之间的区别< / em>和execve man page