1

私のオペレーティング システム クラスでは、シェルのようなプログラムを実装する必要があります。解釈方法がわからない例に遭遇しました:

echo "test" > out1 > out2

これを実行すると、out1 と out2 が作成されますが、out1 は空で、out2 には「test」が含まれています。

echo プロセスを起動し、stdout が out1 に出力されるように変更したら、次は何をしますか?

4

1 に答える 1

5

リダイレクトは左から右に処理されます。最初に> 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

于 2013-03-06T01:37:03.890 に答える