shell和命令替换中的“set -e”

时间:2010-12-30 02:40:24

标签: shell robustness

在shell脚本中,set -e通常用于通过在脚本执行的某些命令以非零退出代码退出时停止脚本来使其更加健壮。

通常很容易通过在末尾添加|| true来指定您不关心某些成功的命令。

当您真正关心返回值时会出现问题,但不希望脚本停止在非零返回代码上,例如:

output=$(possibly-failing-command)
if [ 0 == $? -a -n "$output" ]; then
  ...
else
  ...
fi

这里我们要检查退出代码(因此我们不能在命令替换表达式中使用|| true)并获取输出。但是,如果命令替换命令失败,整个脚本将因set -e停止。

是否有一种干净的方法可以阻止脚本在此处停止而不会取消设置-e并在之后重新设置它?

1 个答案:

答案 0 :(得分:4)

是的,在if语句中内联进程替换

#!/bin/bash

set -e

if ! output=$(possibly-failing-command); then
  ...
else
  ...
fi

命令失败

$ ( set -e; if ! output=$(ls -l blah); then echo "command failed"; else echo "output is -->$output<--"; fi )
/bin/ls: cannot access blah: No such file or directory
command failed

Command Works

$ ( set -e; if ! output=$(ls -l core); then echo "command failed"; else echo "output is: $output"; fi )
output is: -rw------- 1 siegex users 139264 2010-12-01 02:02 core