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


81

私はこの表現に少し混乱しました:

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

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

上記のスニペットでは、doesM=1N='compiler.txt'?これは次とどの程度正確に異なりますか。

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

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

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

回答:


93

これはと同じ&>です。bashのマンページから:

標準出力と標準エラーのリダイレクトこの構成により、標準出力(ファイル記述子1)と標準エラー出力(ファイル記述子2)の両方を、名前が単語の展開であるファイルにリダイレクトできます。

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

7
ばかげている。私は他の情報源を読むのにたくさんの時間を費やしました、そしてそれはマンページのすぐそこにありました。
対偶2012年

3
>&stdoutとstderrの両方をリダイレクトするためにcshとtcshによって使用される構文です。それがおそらくbashがそれを受け入れる理由です。
キーストンプソン

4
これは、&>word>word 2>&1が意味的に同等であることを意味しますか?「これ」の前例は私にはわかりません。
ジェネオラマ2015年

8
@geneorama &>word>word 2>&1 >&wordまったく同じです。
jordanm 2015年

1
今、私は他の場所で読んだものに基づいて、以前に間違いを犯したことに気づきました。>標準をリダイレクトするだけです。 >エラーをリダイレクトしません。(私はおそらく私の将来のコメントをにリダイレクトする必要があります/dev/null
ジェネラマ2015年

8

&>vs >&:推奨バージョンは&>(clobber)

について:

  • &>
  • >&

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

ただしbash手動のリダイレクトセクションでは次のように追加されます。

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

>word 2>&1

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

(注:zsh両方等価です。)

最初の(&>)形式で指の記憶を取得することは非常に良い習慣です。理由は次のとおりです。

(追加)によってサポートさ&>>>>&ていないように使用するbash

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

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

&>>word

これは意味的には同等です

>>word 2>&1

(以下のファイル記述子の複製を参照してください)。

注意:

  • 追加する方法が1つしかないため、上記のセクションでの&>overのclobberの使用を>&再度お勧めします。bashます。
  • zsh&>>>>&フォームの両方を許可します。

この回答は、賛成の回答よりもはるかに役立ちます。
スレイヤー

&シェルインタプリタによって1と2に変換される特殊文字はそうですか?
FakherMokadem19年

@FakherMokademいいえ、マニュアルを参照してください。
トム・ヘイル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.