在bash脚本中,"set -eu"是什么作用?

我已经谷歌了一下,但没有找到关于这个组合的解释。
在bash shell脚本的开头,set -eu 是什么意思?
(我能找到一些关于-e的解释,但没有关于-eu的解释。)

逐个查找bash set命令以及开关-e和-u。 - David
当说选项“-eu”与选项“-e”和选项“-u”相同时,问题是否会得到回答?此外,我认为在提出这个问题之前,你应该更加努力地尝试回答它。 - U. Windl
1@user253751 还有+eu可以用来撤销-eu,事情会变得有点混乱 :D - oleksii
@U.Windl 搜索了“-u”。未找到任何内容。因此我提问了。 - KansaiRobot
这些是SHELL选项,通过使用"set"或"shopt"进行切换。#教会一个人如何搜索 :-) - conny
1个回答

bash man pageshell builtin commands部分中解释了set命令。可以单独设置-e-u,但在调试时通常与-x组合使用,如set -eux或在shebang中使用#!/bin/bash -eux
-e      Exit  immediately  if  a  pipeline  (which  may  consist of a single simple
        command), a list, or a compound command (see SHELL  GRAMMAR  above),  exits
        with  a non-zero status.  The shell does not exit if the command that fails
        is part of the command list immediately following a while or until keyword,
        part  of  the  test  following  the  if or elif reserved words, part of any
        command executed in a && or || list except the command following the  final
        &&  or  ||,  any  command  in  a pipeline but the last, or if the command's
        return value is being inverted with !.  If a compound command other than  a
        subshell  returns  a  non-zero status because a command failed while -e was
        being ignored, the shell does not exit.  A trap on ERR, if set, is executed
        before  the  shell exits.  This option applies to the shell environment and
        each subshell environment separately  (see  COMMAND  EXECUTION  ENVIRONMENT
        above),  and  may cause subshells to exit before executing all the commands
        in the subshell.


-u      Treat  unset variables and parameters other than the special parameters "@"
        and "*" as an error when performing parameter expansion.  If  expansion  is
        attempted  on  an  unset  variable  or parameter, the shell prints an error
        message, and, if not interactive, exits with a non-zero status.

2除了优秀的答案之外,你会在脚本中看到这个用法来改进错误处理。如果没有使用-e选项,当底层命令返回错误代码时,脚本将继续执行。在许多情况下,你可能希望在此时终止脚本的执行。-u选项可以防止意外使用未定义的变量,例如,如果脚本使用了一个变量$foo,但在使用之前没有设置它的值,-u标志将告诉bash停止执行并显示错误信息。 - oleksii
@oleksii 谢谢你的出色贡献! - KansaiRobot