&>>&と2>&1のリダイレクトの違い


12

、このSOスレッドといくつかの他のスレッド私はリダイレクトするため、次のコマンドを見ているstdoutstderr、ファイルに。

それらはすべて同等ですか?それらの間に違いはありますか?

command1 >> logfile 2>&1
command &> logfile
command >& logfile

1
最後の2つは同等です:stackoverflow.com/q/11255447/1032785
jordanm 14

回答:


7

をタグ付けしたのでzsh、3つのリダイレクトすべてがまったく同じように機能することを教えてください。あなたは両方の重複投稿(コメントに1つ、あなたのポストの1)で読んだことがあるかもしれませんが、彼らはすべてのリダイレクトがstderrstdoutたこれにより、次にファイル「ログファイル」にリダイレクトされる(すなわち、ログファイルが出力され、エラーの両方が含まれています)。

ただし、それらの動作は、使用しているシェルに応じてLOTを変更します。

すべてのリダイレクトの3つのスタイルがで同じようにうまく機能bashし、zsh

だが:

またはでのみ>&動作しますcshtcsh

[soum@server ~]$  ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$

kshのみ2>&1動作します。

$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1]     23039
$ 1  2  3  4  5  6  logfile  test.sh
ls: cannot access ttr: No such file or directory

[1] +  Done(2)                 ./test.sh &> logfile

嫌いkshです。ながら>&だけエラーを与え、&>コマンドの一部をバックグラウンドにし、(空でない場合)ログファイルを空にする。


1
どういう意味sh?POSIXシェルで&>あり、機能し>&ない場合。
cuonglm

悲しいことに、最初の声明は事実上間違っています。clobber vs appendに対する私の答えをご覧ください。
トム・ヘイル

1

&>および>&半等価性(大麻)

zsh手動リダイレクトのセクションでは、その言葉:

  • &>
  • >&

同等です。

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

ただしbash手動のリダイレクトセクションには以下が追加されます。

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

>word 2>&1

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

ですから、をタグ付けしている間はzshbashスクリプトを記述する場合に最初の形式でフィンガーメモリを取得することをお勧めします。

>> logfile 2>&1および&>>等価(追加)

ここでlogfileは、上書きされませんが、ファイルの最後、つまり追加モード(O_APPEND)で書き込み用に開かれます。

両方{ba,z}shで同等のものは次のとおりです。

command1 &>> logfile

bash

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

&>>word

これは意味的に同等です

>>word 2>&1

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

(注:で追加する方法が1つしかないため、上記のセクションで&>over のclobberの使用を>&再度お勧めしbashます。)

zshとの両方&>>を許可し>>&ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.