36

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

在脚本中,我正在尝试对ls目录进行操作。但这条路可能存在也可能不存在。如果路径不存在,则ls命令失败,因为-e设置了标志。

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

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

4

3 回答 3

51

||您可以使用和保证以 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 )
于 2012-09-20T01:38:25.923 回答
5

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

trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist
于 2012-09-20T02:10:18.910 回答
3

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

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

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

于 2012-09-20T01:32:19.237 回答