2

我正在执行:

Command1 | tee >(grep sth) || Command2 

我希望Command2根据grep的退出状态执行,而在当前配置中,它是根据tee的结果执行的。

据我所知 pipefail 和 pipestatus 在这里不起作用(如果我错了,请纠正我)。

基于 Alexej Answer 修改 Origian 问题

我也试过Command1 | tee >(grep sth || Command2)了,这适用于我原来的问题,但是当我试图在子shell中设置我的测试状态时;例如,Command 1 | tee>(grep sth || Result="PASSED")以后可以访问我代码的其他块中的结果。所以我还是有问题。

谢谢

4

1 回答 1

2

将您的脚本更改为:

Command1 | tee >(grep sth || Command2)

以达到预期的结果。

关于 Subshel​​ls 的一句话

>(....)是一个子shell。您在该子shell 中所做的任何事情(除了所述子shell 的退出状态)都与外界完全(a=1); echo $a隔离:永远不会回显 number 1,因为a 只有在定义它的子shell 中才有意义。

我不完全明白为什么,但是当您重定向到子shell 时,它似乎反转了该子shell 的退出状态,因此将返回失败并返回true成功false

echo 'a' >(grep 'b') && echo false
# false
(exit 1) || echo false
# false

因此,如果我的第一个建议不适合您,请尝试重新编写您的脚本:

Command1 | tee >(grep sth) && Command2

一个例子

a=1 # `a` now equals `1`
# if I run `exit`, $a will go out of scope and the terminal I'm in might exit
(exit) # $a doesn't go out of scope because `exit` was run from within a subshell.
echo $a # $a still equals `1`

在哪里可以了解有关子外壳的更多信息

从子shell 中设置父shell 的变量
在KSH
变量中从子shell 向父传变量值在子shell
http://www.tldp.org/LDP/abs/html/subshel
​​ls.html http://mywiki.wooledge 中丢失。 org/SubShell
http://wiki.bash-hackers.org/syntax/expansion/proc_subst

于 2014-04-14T21:08:37.723 回答