Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回代码为否定的Shell errexit_Shell - Fatal编程技术网

返回代码为否定的Shell errexit

返回代码为否定的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 当此选项处于启用状态时,当任何命令失败时(出于外壳程序错误后果中列出的任何原因或通过返回大于零的退出状态),外壳程序应立即退出,但以下情况除外: 多命令管道中

我有一个带有errexit选项的shell脚本。如何在脚本内部否定命令的返回代码,从而使其失败

$ 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
,如果第一个命令返回成功,这将导致退出。当然,simple
true&&exit
可以很好地工作。我通过将命令包装到子shell中解决了这个问题。看看我的答案。
$ cat a
#!/bin/sh
set -o errexit -o xtrace
(! true)
echo Oook.

$ ./a
+ true