返回代码为否定的Shell errexit
我有一个带有errexit选项的shell脚本。如何在脚本内部否定命令的返回代码,从而使其失败返回代码为否定的Shell errexit,shell,Shell,我有一个带有errexit选项的shell脚本。如何在脚本内部否定命令的返回代码,从而使其失败 $ cat a #!/bin/sh set -o errexit -o xtrace ! true echo Oook. $ ./a + true + echo Oook. Oook. echo命令不应该执行。据我所知,您不能执行 从 -e 当此选项处于启用状态时,当任何命令失败时(出于外壳程序错误后果中列出的任何原因或通过返回大于零的退出状态),外壳程序应立即退出,但以下情况除外: 多命令管道中
$ cat a
#!/bin/sh
set -o errexit -o xtrace
! true
echo Oook.
$ ./a
+ true
+ echo Oook.
Oook.
echo
命令不应该执行。据我所知,您不能执行
从
-e
当此选项处于启用状态时,当任何命令失败时(出于外壳程序错误后果中列出的任何原因或通过返回大于零的退出状态),外壳程序应立即退出,但以下情况除外:
多命令管道中任何单个命令的故障不得导致外壳退出。仅考虑管道本身的故障
在while、if或elif保留字,以开头的管道之后执行复合列表时,应忽略-e设置!保留字,或与或列表中除最后一个以外的任何命令
如果子shell命令以外的复合命令的退出状态是在忽略-e时失败的结果,则-e不适用于该命令
此要求分别适用于shell环境和每个子shell环境。例如,在:
set -e; (false; echo one) | cat; echo two
false命令导致子shell退出而不执行echo one;但是,执行echo two是因为管道的出口状态(false;echo one)| cat为零
这是人们经常建议不要使用errexit
的众多原因之一。它只是不够可靠,太容易“破碎”
正如lars在评论中指出的,解决方法是
maybe-true || false
或
您只需调查
grep
的退出状态,找到匹配项时为0,未找到匹配项时为1,发生错误时为2,然后将退出状态转换为适合您需要的状态:
grep -q "$regex" file
stat=$?
case $stat in
(0) echo found; exit 1;;
(1) echo not found; exit 0;;
(2) echo error; exit 2;;
(*) echo something unexpected; exit $stat;;
esac
我通过将命令包装到子shell中解决了这个问题
$ cat a
#!/bin/sh
set -o errexit -o xtrace
(! true)
echo Oook.
$ ./a
+ true
具体地说,我需要否定grep-qr命令。你到底需要做什么?当
grep
找到您的内容时失败?是的。对另一个应用程序的源代码进行简单的lint检查。而不是!true
您可以使用true | | false
,如果第一个命令返回成功,这将导致退出。当然,simpletrue&&exit
可以很好地工作。我通过将命令包装到子shell中解决了这个问题。看看我的答案。
$ cat a
#!/bin/sh
set -o errexit -o xtrace
(! true)
echo Oook.
$ ./a
+ true