2017-11-08 13 views
0

私はサブシェルが彼らのstdoutが呼び出し側の出力を抑制持っていることを知っている:サブシェルのstderrが抑制またはリダイレクトされないのはなぜですか?

a:123 

しかし、それはサブシェルでだとして、なぜ標準エラー出力が抑制されていません:予想通り、この出力

a=$(echo 123) 
echo a:$a 

(何)

実際の出力:ここ

123 

は標準エラーがstdoutにリダイレクトする必要があり、変数aに捕捉することが試験である:

出力予想

a=$(>&2 echo 123) 

a=$(>&2 echo 123 2>&1) 
echo a:$a 

期待出力:

a:123 

実際の出力:

答えて

1
123 
a: 

出力が抑制されていません。それはが捕捉されたです。これは普通のサブシェル(echo foo)コマンド置換の違いです。a=$(echo foo)です。さらに、コマンド置換は標準エラーのみをキャプチャしません。標準出力のみをキャプチャします。ここで

+0

stderrはコマンド置換によってサブシェルからキャプチャできますか? – Zhro

+0

厳密に言えば、いいえ。他のファイル記述子に標準出力をコピーし、標準エラーを標準出力にコピーし、元の標準出力をどうするかを決定するために、いくつかの歪曲を行う必要があります。 – chepner

0

標準エラー出力はstdoutにリダイレクトする必要があり、変数aに捕獲され、テストです。

a=$(>&2 echo 123 2>&1) 

  1. まずあなたはFD2が現在使用しているものにFD1をリダイレクト:>&2 - 今、stdoutはstderrを指しています。
  2. 次に、現在使用しているfd1にfd2をリダイレクトします。2>&1 - stderrがstderrをポイントするようになりました。

stderrがstdoutを参照するようにしたい場合は、最初にstdoutをリダイレクトすることはできません。 >&2

関連する問題