我所有的脚本都已打开errexit。也就是说,我运行set -o errexit
。但是,有时我想运行grep
之类的命令,但是即使命令失败,也想继续执行我的脚本。
我该怎么做呢?也就是说,如何在不杀死整个脚本的情况下将命令的退出代码转换为变量?
我可以关闭errexit,但我不想这样做。
最佳答案
您的errexit
仅在失败的命令为“unested”时才导致脚本终止。在FreeBSD上按man sh
:
Exit immediately if any untested command fails in non-interactive
mode. The exit status of a command is considered to be explic-
itly tested if the command is part of the list used to control an
if, elif, while, or until; if the command is the left hand oper-
and of an ``&&'' or ``||'' operator; or if the command is a pipe-
line preceded by the ! keyword.
所以..如果您正在考虑使用这样的构造:
grep -q something /path/to/somefile
retval=$?
if [ $retval -eq 0 ]; then
do_something # found
else
do_something_else # not found
fi
您应该改用这样的构造:
if grep -q something /path/to/somefile; then
do_something # found
else
do_something_else # not found
fi
关键字
if
的存在使grep命令测试了,因此不受errexit
的影响。而且这种方式需要更少的打字。当然,如果您确实需要变量中的退出值,则没有什么可以阻止您使用
$?
:if grep -q something /path/to/somefile; then
do_something # found
else
unnecessary=$?
do_something $unnecessary # not found
fi