您的问题与xargs
无关。
bash的-e
选项有点棘手。
-e退出立即如果管道(其可以由单个 简单命令的),一个列表,或化合物命令 ,退出与非零 状态。 壳如果 失败的指令是下面的一个while
或until
关键字命令列表的一部分立即 ,测试 以下的if
或elif
保留字的一部分不退出,任何 命令的一部分在一个&&
执行或||
名单,除了在最终&&
或||
,在 管道的任何命令,但最后还是命令 如果命令的返回值 正在反转!
。
让我们来看一个非常简单的例子:
$ cat exit_on_error_test.sh
#!/bin/bash
trap 'echo Interrupted because of an error' ERR
set -e
! true
echo Exit status: $?
$ ./exit_on_error_test.sh
Exit status: 1
$
因此,即使的“! true
”是非零,剧本被允许运行至年底,并输出值退出状态的退出状态。这是因为我们没有任何失败的命令 - 非零退出代码是由于故意的否定。但是,如果我们在括号中附上“! true
”,我们将引入失败的(复合)命令。
$ cat exit_on_error_test.sh
#!/bin/bash
trap 'echo Interrupted because of an error' ERR
set -e
(! true) # This as a whole is now a failing (compound) command
echo Exit status: $?
$ ./exit_on_error_test.sh
Interrupted because of an error
$
“*与grep(没有xargs)一起使用时,这个工作方式没有括号。*”这有点不清楚。你会显示代码吗? – Leon
_“脚本不退出”_也不清楚。 –
['set -e'充满了陷阱](http://mywiki.wooledge.org/BashFAQ/105),以至于bash社区对它是否是一个好主意非常分歧。 –