2

私は実行しています:

Command1 | tee >(grep sth) || Command2 

Command2はgrepの終了ステータスに基づいて実行されますが、現在の構成ではteeの結果に基づいて実行されています。

私の知る限り、pipefail と pipestatus はここでは機能していません (間違っている場合は修正してください)。

アレクセイの回答に基づくオリジアンの質問への修正

も試しCommand1 | tee >(grep sth || Command2)ましたが、これは元の質問で機能しますが、サブシェルでテストのステータスを設定しようとしているためです。ex、そして後で私のコードの他のチャンクでResultCommand 1 | tee>(grep sth || Result="PASSED")にアクセスできます。だから私はまだ問題があります。

ありがとう

4

1 に答える 1

2

スクリプトを次のように変更します。

Command1 | tee >(grep sth || Command2)

望ましい結果を達成するために。

サブシェルについて一言

>(....)サブシェルです。そのサブシェル内で行うすべてのこと (上記のサブシェルの終了ステータスを除く) は、外部の世界から完全に分離されています: number が定義されているサブシェル内でのみ意味を持つため(a=1); echo $a、 number をエコーすることはありません。1a

理由はよくわかりませんが、サブシェルにリダイレクトすると、そのサブシェルの終了ステータスが逆になり、失敗が返さ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`

サブシェルについて詳しく知ることができる場所

サブシェルから親シェルの変数を設定する
KSH で変数を子から親に渡す 変数の
値がサブシェル
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 に答える