リンクリダイレクトの内部ロジック

リンクリダイレクトの内部ロジック

私が入力している間

cat some_file > new_file1 > new_file2

some_fileinと空白からnew_file2出力を取得しますnew_file1

これの内部ロジックは何ですか?具体的には、stdoutファイルの内容は何ですか?

注:Windowsでは中間ファイルをスキップします。

答え1

シェルによって異なります。

Bashはecho derp >file1 >file2最初に開いて切り取り、次にofを作成file1する準備をします。その後、bashは次の操作を行います。つまり、開き、切り取り、of がwrite の代わりに書かれるように準備します。stdoutecho derpfile1file2file2stdoutecho derpfile2

最終的な効果は、切り捨てられたfile1(つまりコンテンツが削除された)リンクがstdout発生しないことですfile2。 Bashは標準出力を一度に1つの場所にのみリダイレクトできます。パイプの場合も同様です。echo derp > file | cat「derp」の結果は、パイプではなくファイルに書き込まれます。

ただし、zshでは直感的に予想されるように、およびecho derp >file1 >file2が同時に作成されますfile1。 zshを使用している場合は、file2詳細についてはMULTIOSを参照してください。man zshmisc

これを外部で達成するには、次のようにzshしますteeecho derp | tee file1 file2 > /dev/nullzshと同じですecho derp >file1 >file2

関連情報