如何设置-e选项时如何避免bash脚本失败?

Bhu*_*han 26 bash shell scripting

我有一个带-e选项集的bash脚本,它在第一个错误时使整个脚本失败.

在脚本中,我正在尝试ls在目录上执行操作.但是这条路可能存在也可能不存在.如果该路径不存在,则该ls命令将失败,因为该-e标志已设置.

有没有办法可以防止脚本失败?

作为一个方面说明,我已经试过的伎俩做一个set +eset -e前和命令后,它的工作原理.但我正在寻找更好的解决方案.

che*_*ner 39

您可以使用"捕获"错误||并保证以0状态退出的命令:

ls $PATH || echo "$PATH does not exist"
Run Code Online (Sandbox Code Playgroud)

由于复合命令成功是否$PATH存在,set -e因此不会触发,您的脚本也不会退出.

要以静默方式抑制错误,可以使用以下true命令:

ls $PATH || true
Run Code Online (Sandbox Code Playgroud)

要执行多个命令,可以使用以下复合命令之一:

ls $PATH || { command1; command2; }
Run Code Online (Sandbox Code Playgroud)

要么

ls $PATH || ( command1; command2 )
Run Code Online (Sandbox Code Playgroud)

请确保在复合命令中都没有任何失败.第二个示例的一个好处是您可以在子shell中关闭立即退出模式,而不会影响其在当前shell中的状态:

ls $PATH || ( set +e; do-something-that-might-fail )
Run Code Online (Sandbox Code Playgroud)


lea*_*fei 5

另一种选择是用来trap捕捉EXIT信号:

trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist
Run Code Online (Sandbox Code Playgroud)