2016-05-06 14 views
1

私はそれが出力になるかを理解しないで次の簡単な例があります。Bashの出力が期待できないとして

#!/bin/bash 

function wtf() { 
    echo -e "test1" >&1 
    sleep 2 
    echo -e "test2" >&1 
} 

a=$(wtf) 
echo $a 

端末上の出力は2秒test1 test2

の後であります

私はちょうどwtfに最後の2行を変更すると、出力は

test1 
test2 #after 2 seconds 
  1. Whのですyは最初のバージョンでtest1 test2と同じ行にありますか?
  2. test1 test2の出力は、2秒後に2番目のtest2しか表示されないため、なぜ2秒間表示する必要がありますか?

答えて

1

$(...)は、サブシェル内のコマンドのstdoutをキャプチャします。 echo -eステートメントは、呼び出し側シェル のstdoutには印刷されませんが、サブシェルではバッファされます。 echo $aコマンドを削除すると、何も印刷されません。

この例のサブシェルは、wtfが完了するまで終了しません。 そのため、呼び出しシェルが制御を戻すように2秒間待たなければならず、echo $aでサブシェルによって取得されたすべての出力が表示されます。

+0

Thxを明確にするには、関数の中でとにかにstdoutに出力する方法がありますか? – wasp256

+0

'stdout'はサブシェルによって取り込まれるので、できません。 'echo test3>&2'で' stderr'に印刷することができました – janos

+0

それはthxを動かしました – wasp256

関連する問題