我有以下脚本:
#!/bin/bash
set -e
function do_it {
rm this-file-does-not-exit
echo "Continuing ..."
echo "Done ..."
return 0
}
if do_it ; then
echo "Success"
else
echo "Error"
fi
echo "End of script"
产生:
rm: cannot remove 'this-file-does-not-exit': No such file or directory
Continuing ...
Done ...
Success
End of script
该函数不会被中止,因为在
if
语句中运行该函数会禁用该函数的set -e
(并且无法启用)。这不是我想要的。无法在
if
语句之外运行该函数并收集结果,因为在这种情况下,如果该函数失败,则完整的脚本将被中止:#!/bin/bash
set -e
function do_it {
rm this-file-does-not-exit
echo "Continuing ..."
echo "Done ..."
return 0
}
do_it
if $? ; then
echo "Success"
else
echo "Error"
fi
echo "End of script"
产生:
rm: cannot remove 'this-file-does-not-exit': No such file or directory
我想要以下内容:
函数中的
可以如下实现:
#!/bin/bash
set -e
function do_it {
rm this-file-does-not-exit || return $?
echo "Continuing ..." || return $?
echo "Done ..." || return $?
return 0
}
if do_it ; then
echo "Success"
else
echo "Error"
fi
echo "End of script"
哪个产生我想要的:
rm: cannot remove 'this-file-does-not-exit': No such file or directory
Error
End of script
但是,这使得该功能的实现完全不可读:每行必须后跟一个
|| return $?
每当函数中的语句失败时,还有另一种方法来中止函数和仅中止函数吗?
最佳答案
您可以使用“pipefail”来获取管道中最后执行的命令的返回码。
我不会说它看起来比您的代码好得多,但至少它更短。
#!/bin/bash
set -ep
function do_it {
rm this-file-does-not-exit &&
echo "Continuing ..." &&
echo "Done ..."
return $?
}
if do_it ; then
echo "Success"
else
echo "Error"
fi
echo "End of script"
在这种情况下,函数将在第一个失败的命令(rm)之后立即停止执行,结果将是管道中最后一个命令的返回代码。如果“rm ”将成功,则两个回显都应起作用,并且返回码将为0。
输出:
$ touch this-file-does-not-exit
$ ./script-return.sh
Continuing ...
Done ...
Success
End of script
$ ./script-return.sh
rm: cannot remove 'this-file-does-not-exit': No such file or directory
Error
End of script
关于linux - 如何中止仅在出错时起作用但不中止脚本?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59320542/