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

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

bash 脚本顶部的euafter是什么意思?#!/bin/bash -eu

通常我用这个开始我的 bash 脚本哈希邦/什邦

#!/bin/bash

但我刚刚遇到一个

#!/bin/bash -eu

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


不重复:

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

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

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

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

答案1

-e它们与和-uto是相同的选项内置set。它们也可以在 shell 命令行上给出,也可以从 hashbang 行作为命令行参数给出。 (但请注意,例如问题shebang 中的多个参数

在线手册说,在“调用巴什”, 那

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

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

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

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

答案2

这些是 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..."

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


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

相关内容