この表現に少し混乱しました。
gcc -c -g program.c >& compiler.txt
&>filename
がstdoutとstderrの両方をfilename
ファイルにリダイレクトすることを知っています。ただし、この場合、アンパサンドは大なり記号の後にあります。 M>&N
という形式のように見えます。ここで、M
とN
はファイル記述子です。
上記のスニペットでは、M=1
とN='compiler.txt'
がありますか?これはどのくらい正確に異なります:
gcc -c -g program.c > compiler.txt (ampersand removed)
私の理解では、開いている各ファイルは2より大きいファイル記述子に関連付けられています。これは正しいですか?
その場合、ファイル名はリダイレクトのターゲットとしてそのファイル記述子と交換可能ですか?
これは&>
と同じです。 bashのマンページから:
標準出力と標準エラーのリダイレクトこの構成により、標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)の両方を、Wordの拡張名を持つファイルにリダイレクトできます。
There are two formats for redirecting standard output and standard error: &>Word and >&Word Of the two forms, the first is preferred. This is semantically equiva- lent to >Word 2>&1
&>
vs >&
:優先バージョンは&>
(大まかな)に関して:
&>
>&
どちらもファイルを上書きします-> file
がSTDINのみの場合に行うように、ファイルに書き込む前にファイルを0バイトに切り捨てます。
ただし、、 bash
手動リダイレクトセクション は以下を追加します。
2つの形式のうち、最初の形式が優先されます。これは意味的に同等です
>Word 2>&1
2番目の形式を使用する場合、Wordは数字または
-
に展開できない場合があります。存在する場合、互換性の理由から他のリダイレクト演算子が適用されます(下記のファイル記述子の複製を参照)。
(注: zsh
の両方は同等です 。)
次の理由から、最初の(&>
)形式でフィンガーメモリを取得することをお勧めします。
&>>
はbash
によってサポートされないため、>>&
を使用します(追加)追加フォームは1つだけです。
標準出力と標準エラーを追加する形式は次のとおりです。
&>>Word
これは意味的に同等です
>>Word 2>&1
(以下のファイル記述子の複製を参照)。
注意:
bash
に追加する方法が1つしかないため、上記のセクションの&>
を>&
で上書きすることをお勧めします。zsh
は、&>>
と>>&
の両方のフォームを許可します。