我有一个带有-e
选项集的 bash 脚本,它在第一个错误时使整个脚本失败。
在脚本中,我正在尝试对ls
目录进行操作。但这条路可能存在也可能不存在。如果路径不存在,则ls
命令失败,因为-e
设置了标志。
有没有办法可以防止脚本失败?
作为旁注,我已经尝试过在该命令之前和之后执行 and 的技巧,它可以工作set +e
。set -e
但我正在寻找更好的解决方案。
||
您可以使用和保证以 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 )
另一种选择是用来trap
捕捉EXIT
信号:
trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist
一种解决方案是测试文件夹的存在
function myLs() {
LIST=""
folder=$1
[ "x$folder" = "x" ] && folder="."
[ -d $folder ] && LIST=`ls $folder`
echo $LIST
}
这样 bash 如果$folder
不存在就不会失败