我有一个设置了-e
选项的bash脚本,它在第一个错误时就失败了整个脚本。
在脚本中,我试图在目录上执行ls
。但是这条路可能存在也可能不存在。如果路径不存在,则ls
命令失败,因为设置了-e
标志。
有没有办法阻止脚本失败?
作为旁注,我尝试了在该命令之前和之后执行set +e
和set -e
的技巧,并且它可以正常工作。但我正在寻找更好的解决方案。
答案 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不会失败