web-dev-qa-db-ja.com

>&はどういう意味ですか?

この表現に少し混乱しました。

gcc -c -g program.c >& compiler.txt

&>filenameがstdoutとstderrの両方をfilenameファイルにリダイレクトすることを知っています。ただし、この場合、アンパサンドは大なり記号の後にあります。 M>&Nという形式のように見えます。ここで、MNはファイル記述子です。

上記のスニペットでは、M=1N='compiler.txt'がありますか?これはどのくらい正確に異なります:

gcc -c -g program.c > compiler.txt     (ampersand removed)

私の理解では、開いている各ファイルは2より大きいファイル記述子に関連付けられています。これは正しいですか?

その場合、ファイル名はリダイレクトのターゲットとしてそのファイル記述子と交換可能ですか?

69
contrapositive

これは&>と同じです。 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
79
jordanm

&> vs >&:優先バージョンは&>(大まかな)

に関して:

  • &>
  • >&

どちらもファイルを上書きします-> fileがSTDINのみの場合に行うように、ファイルに書き込む前にファイルを0バイトに切り捨てます。

ただし、bash手動リダイレクトセクション は以下を追加します。

2つの形式のうち、最初の形式が優先されます。これは意味的に同等です

>Word 2>&1

2番目の形式を使用する場合、Wordは数字または-に展開できない場合があります。存在する場合、互換性の理由から他のリダイレクト演算子が適用されます(下記のファイル記述子の複製を参照)。

(注: zshの両方は同等です 。)

次の理由から、最初の(&>)形式でフィンガーメモリを取得することをお勧めします。

&>>bashによってサポートされないため、>>&を使用します(追加)

追加フォームは1つだけです。

標準出力と標準エラーを追加する形式は次のとおりです。

&>>Word

これは意味的に同等です

>>Word 2>&1

(以下のファイル記述子の複製を参照)。

注意:

  • bashに追加する方法が1つしかないため、上記のセクションの&>>&で上書きすることをお勧めします。
  • zshは、&>>>>&の両方のフォームを許可します。
2
Tom Hale