bash 脚本顶部的 `#!/bin/bash -eu` 中的 `-eu` 是什么意思?(或任何`-abefhkmnptuvxBCHP`)

Gab*_*les 0 bash shell-script shebang

在 bash 脚本的顶部eu之后是什么意思#!/bin/bash -eu

通常我用这个hashbang/shebang开始我的 bash 脚本:

#!/bin/bash
Run Code Online (Sandbox Code Playgroud)

但我只是遇到了一个

#!/bin/bash -eu
Run Code Online (Sandbox Code Playgroud)

我不知道为什么有一个-eu那里。阅读这些man bash页面似乎对我没有帮助,但也许我忽略了一些东西。


不是重复的:

这不是使用 `set -eu` 时 EXIT 和 ERR 陷阱正确行为的重复。

在这个问题下面的评论中引用@ilkkachu,直接解决这个问题:

... -e 和 -u 如何处理陷阱或其他任何东西与它们和其他单字符选项在命令行上的给出方式完全无关。

我同意这一点。这些是不同的问题和答案,背后有着不同的动机。这个问题是如此不同,我什至在尝试理解我自己的问题的答案时,都不会想通过查看它的标题或描述来点击它,而且答案也大不相同。

ilk*_*chu 8

他们是相同的选项-e,并-uset内置。它们也可以在 shell 命令行上给出,它们也可以从 hashbang 行作为命令行参数给出。(但请注意,例如shebang 中的 Multiple arguments问题)

在线手册说,在“调用 Bash”下

当调用 shell 时,所有与 set 内置函数一起使用的单字符选项都可以用作选项。

在线手册 ( bash [long-opt] [-abefhkmnptuvxdBCDHP] [-o option] ... )的调用概要中也明确列出了单字符选项,但联机帮助页中没有列出。

set -u 告诉 shell 将扩展未设置的参数视为错误,这有助于捕获例如变量名称中的拼写错误。

set -e如果命令退出并出现错误,则告诉 shell 退出(除非以其他方式测试了退出值)。在某些情况下,这可用于在出错时中止脚本,而无需显式测试每个命令的状态。


Qua*_*odo 5

这些是 Bash 脚本的选项,如man bash,set内置命令中所述。

就在开头man bash

选项

在 set 内置命令的描述中记录的所有单字符 shell 选项(包括 -o)都可以在调用 shell 时用作选项。

现在,set不是一个单独的命令,它是一个内置的 shell。这就是为什么您没有找到带有man set. 相反,在 bash 手册中,您会找到SHELL BUILTIN COMMANDS部分。将有set内置函数,可以在其中找到:

-e 如果管道(可能由单个简单命令组成)、列表或复合命令(参见上面的 SHELL GRAMMAR)以非零状态退出,则立即退出。(……)

-u 执行参数扩展时,将未设置的变量和特殊参数“@”和“*”以外的参数视为错误。如果在未设置的变量或参数上尝试扩展,shell 会打印一条错误消息,如果不是交互式的,则以非零状态退出。

因此,在我下面的示例中,该-u标志将使脚本在第一个回声时退出,因为notDeclared它没有被声明。同样,它会grep因为-e标志而退出,因为nonExistentFile不存在并且 grep 是一个简单的命令,以错误(非零)状态退出。

#!/bin/bash -ue

echo "$notDeclared"
grep something nonExistentFile
echo "I am never going to be echoed..."
Run Code Online (Sandbox Code Playgroud)

如果您想看到它在 grep 上退出,请删除-u或移至grep顶部。


注意grepgrep如果在文件中找不到模式,则以非零状态退出。因此,在上面的示例中,如果您创建nonExistentFilesomething内容中没有字符串,grep则会以 1(非零)退出,因此,由于该-e标志,执行将终止。这可能令人惊讶,因为在文件中找不到表达式并不是真正的“错误”。


归档时间:

查看次数:

1863 次

最近记录:

5 年,2 月 前