当设置-e选项时,如何避免bash脚本失败?
我有一个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" ] &
-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