退出状态tee>(...)

时间:2014-04-14 21:03:15

标签: tee subshell exitstatus

我正在执行:

Command1 | tee >(grep sth) || Command2 

我想根据 grep 的退出状态执行 Command2 ,而在当前配置中,它是根据 tee <的结果执行的/强>

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

根据Alexej答案修改原始问题

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

由于

1 个答案:

答案 0 :(得分:2)

将您的脚本更改为:

Command1 | tee >(grep sth || Command2)

以达到理想的效果。

关于子壳的一个词

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

我不完全理解为什么,但是当你重定向到子shell时,它似乎反转了该子shell的退出状态,因此失败将返回true并且成功将返回{{1 }}

false

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

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

一个例子

Command1 | tee >(grep sth) && Command2

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

Set a parent shell's variable from a subshell
Pass variable from a child to parent in KSH
Variables value gets lost in subshell
http://www.tldp.org/LDP/abs/html/subshells.html
http://mywiki.wooledge.org/SubShell
http://wiki.bash-hackers.org/syntax/expansion/proc_subst