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

时间:2012-09-20 01:21:14

标签: bash shell scripting

我有一个设置了-e选项的bash脚本,它在第一个错误时就失败了整个脚本。

在脚本中,我试图在目录上执行ls。但是这条路可能存在也可能不存在。如果路径不存在,则ls命令失败,因为设置了-e标志。

有没有办法阻止脚本失败?

作为旁注,我尝试了在该命令之前和之后执行set +eset -e的技巧,并且它可以正常工作。但我正在寻找更好的解决方案。

3 个答案:

答案 0 :(得分:37)

您可以使用||和保证以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 )

答案 1 :(得分:5)

另一个选择是使用trap来捕获EXIT信号:

trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist

答案 2 :(得分:3)

一种解决方案是测试文件夹

的存在
function myLs() {
    LIST=""
    folder=$1
    [ "x$folder" = "x" ] && folder="."
    [ -d $folder ] && LIST=`ls $folder`
    echo $LIST
}

这样,如果$folder不存在,bash不会失败