我正在执行:
Command1 | tee >(grep sth) || Command2
我想根据 grep 的退出状态执行 Command2 ,而在当前配置中,它是根据 tee <的结果执行的/强>
据我所知,pipefail和pipestatus在这里不起作用(如果我错了请纠正我。)
根据Alexej答案修改原始问题
我也试过了Command1 | tee >(grep sth || Command2)
,它适用于我原来的问题,但是当我试图在子shell中设置我的测试状态时;例如,Command 1 | tee>(grep sth || Result="PASSED")
及以后可以访问我代码的其他块中的结果。所以我还有问题。
由于
答案 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