“!/bin/sh -e”这行代码是做什么用的?

16

在我的服务器(Linux)中,位于 /etc/init.d/ 文件夹中的文件开头,有这样一行:

 !/bin/sh -e

每次我执行脚本的其余部分都可以正常工作,但是会显示一个错误,这意味着什么?

 !/bin/sh not found

有什么想法吗?


2
到目前为止,还没有人解决 -e 这个问题,因为它似乎不被我的 MacBook 上的 bash 所接受。 - dmckee --- ex-moderator kitten
@dmckee:sh不等于bash。man sh(或man dash)显示“-e errexit:如果不是交互式的,则立即退出,如果任何未经测试的命令失败...” - Mark Peters
顺便说一句,@Camran,即使没有修复shebang行,它仍然能够运行的原因可能是由于直接调用shell解释器,例如sh myScript。有了shebang行,您可以使用chmod +x...设置文件为可执行文件,并在不显式调用解释器的情况下运行它。 - Mark Peters
@Mark: 我知道。但 Mac OS X 没有一个普通的 Bourne Shell,而且我手头也没有 Linux 机器... - dmckee --- ex-moderator kitten
2个回答

31

这行代码定义了将要执行给定脚本的程序。对于sh而言,这行代码通常应该以#字符开头,如下所示:

#!/bin/sh -e

-e 标记的长名称是errexit,使脚本在第一个错误发生时立即退出。以下是来自man sh的更详细描述:

如果不是交互式的,则立即退出,如果任何未经测试的命令失败。如果命令用于控制if, elif, whileuntil语句,则命令的退出状态被认为是明确已经经过测试;或者如果命令是&&||操作符的左操作数,则该命令的退出状态被认为是明确已经经过测试。


这应该是被接受的答案。顶部答案最多只是一个错别字评论。 - Nino Filiu

2
 #!/bin/bash   

这是脚本中的第一行,告诉系统使用Bash shell来执行脚本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接