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

当设置-e选项时,如何避免bash脚本失败?,bash,shell,scripting,Bash,Shell,Scripting,我有一个bash脚本,它设置了-e选项,在第一个错误时整个脚本都失败了 在脚本中,我试图对目录执行ls。但这条道路可能存在,也可能不存在。如果路径不存在,ls命令失败,因为设置了-e标志 有没有办法防止脚本失败 作为补充说明,我尝试了在该命令之前和之后执行set+e和set-e的技巧,效果很好。但是我正在寻找更好的解决方案。一个解决方案是测试文件夹的存在性 function myLs() { LIST="" folder=$1 [ "x$folder" = "x" ] &

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

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

有没有办法防止脚本失败


作为补充说明,我尝试了在该命令之前和之后执行
set+e
set-e
的技巧,效果很好。但是我正在寻找更好的解决方案。

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

function myLs() {
    LIST=""
    folder=$1
    [ "x$folder" = "x" ] && folder="."
    [ -d $folder ] && LIST=`ls $folder`
    echo $LIST
}
这样,如果
$folder
不存在,bash就不会失败

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

ls $PATH || echo "$PATH does not exist"
由于无论
$PATH
是否存在,复合命令都会成功,因此不会触发
set-e
,脚本也不会退出

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

ls $PATH || true
要执行多个命令,可以使用以下复合命令之一:

ls $PATH || { command1; command2; }

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

ls $PATH || ( set +e; do-something-that-might-fail )

另一个选项是使用
trap
捕捉
EXIT
信号:

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

谢谢你的回复。我仍然有一些疑问。如果
ls
命令失败,它仍会打印一条消息,说明某某路径不存在,是否有方法抑制该消息?另外,在
部分中,是否有执行两行代码的方法?
trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist