【发布时间】:2012-09-12 08:48:09
【问题描述】:
我有一个带有 -e 选项集的 bash 脚本,它在第一个错误时使整个脚本失败。
在脚本中,我试图在目录上执行ls。但这条路可能存在也可能不存在。如果路径不存在,ls 命令将失败,因为设置了-e 标志。
有什么方法可以防止脚本失败?
作为旁注,我已经尝试过在该命令之前和之后执行set +e 和set -e 的技巧,它可以工作。但我正在寻找更好的解决方案。
【问题讨论】:
我有一个带有 -e 选项集的 bash 脚本,它在第一个错误时使整个脚本失败。
在脚本中,我试图在目录上执行ls。但这条路可能存在也可能不存在。如果路径不存在,ls 命令将失败,因为设置了-e 标志。
有什么方法可以防止脚本失败?
作为旁注,我已经尝试过在该命令之前和之后执行set +e 和set -e 的技巧,它可以工作。但我正在寻找更好的解决方案。
【问题讨论】:
您可以使用|| 和保证以 0 状态退出的命令“捕获”错误:
ls $PATH || echo "$PATH does not exist"
由于无论$PATH 是否存在,复合命令都会成功,因此不会触发set -e,您的脚本也不会退出。
要静默抑制错误,您可以使用true 命令:
ls $PATH || true
要执行多个命令,可以使用复合命令之一:
ls $PATH || { command1; command2; }
或
ls $PATH || ( command1; command2 )
只要确保在任何一个复合命令中都没有失败。第二个示例的一个好处是您可以在子 shell 中关闭立即退出模式,而不会影响其在当前 shell 中的状态:
ls $PATH || ( set +e; do-something-that-might-fail )
【讨论】:
ls 命令失败,它仍然会打印一条消息,说某某路径不存在,有没有办法抑制它?另外,在OR部分,有没有办法执行2行代码?
另一种选择是使用trap 来捕获EXIT 信号:
trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist
【讨论】:
一种解决方案是测试文件夹的存在
function myLs() {
LIST=""
folder=$1
[ "x$folder" = "x" ] && folder="."
[ -d $folder ] && LIST=`ls $folder`
echo $LIST
}
如果$folder 不存在,这种方式bash 不会失败
【讨论】: