我所有的脚本都已打开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

10-07 19:38