我在bash中编写了一个测试脚本(我们称之为test.sh)。并且脚本的开头具有以下声明:
#!/bin/bash -e
后面是一些代码。
现在,当我将其bash test.sh
与./test.sh
调用时,它会显示不同的结果。这怎么可能。我认为默认情况下./test.sh
从脚本的第一行读取默认shell并使用它调用它。我的理解是否正确。
答案 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。