私のオペレーティング システム クラスでは、シェルのようなプログラムを実装する必要があります。解釈方法がわからない例に遭遇しました:
echo "test" > out1 > out2
これを実行すると、out1 と out2 が作成されますが、out1 は空で、out2 には「test」が含まれています。
echo プロセスを起動し、stdout が out1 に出力されるように変更したら、次は何をしますか?
私のオペレーティング システム クラスでは、シェルのようなプログラムを実装する必要があります。解釈方法がわからない例に遭遇しました:
echo "test" > out1 > out2
これを実行すると、out1 と out2 が作成されますが、out1 は空で、out2 には「test」が含まれています。
echo プロセスを起動し、stdout が out1 に出力されるように変更したら、次は何をしますか?
リダイレクトは左から右に処理されます。最初に> out1
(out1
ファイル記述子 #1 を作成して接続します)、次に> out2
(out2
ファイル記述子 #1 を作成して接続し、前のものを置き換えます)。つまり、2 つの異なるファイルに対して、まったく同じことを 2 回 ( close(1)
plus fd = open(...)
plus ) 実行しているだけです。dup(fd)
追加するように編集: Bashリファレンス マニュアル に記載されているとおり:
リダイレクトは、左から右に表示される順序で処理されます。
POSIXがそれを置くように:
コマンドで複数のリダイレクト演算子が指定されている場合、評価の順序は最初から最後までです。
もちろん、これらの説明は、リダイレクトが実際に同じ単純なコマンド内にある場合にのみ適用されます。このようなもの:
{ echo test > out1 ; } > out2
のリダイレクトは実行前に発生するため、実際には書き込みtest
を行って空白のout1
ままにします。out2
{}
echo test > out1