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

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

存在するこのスレッドstdoutそして他のスレッドでは、リダイレクトとstderrファイルに対する次のコマンドを見ました。

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

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

答え1

ここでタグ付けしたので、zsh3つのリダイレクトがすべてまったく同じように機能することをお知らせします。 2つの重複した投稿(コメント内の投稿と投稿内の投稿)を読み取ったように、両方とも「ログファイル」ファイルにリダイレクトされstderrますstdout(つまり、ログファイルには出力とエラーが含まれます)。 )。

ただし、その動作は現在使用しているシェルによって大きく異なります。

bashリダイレクトする3つの方法はすべて同じ方法でうまく機能します。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 ~]$

ksh2>&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>&エラーが発生しましたが、コマンド&>の一部がバックグラウンドで実行され、ログファイルが消去されました(空でない場合)。

答え2

&>および>&準等価(クローバー)

これzsh手動リダイレクトセクション説明する:

  • &>
  • >&

同等です。

> fileどちらもファイルを破損します。 STDIN専用の場合と同様に、ファイルに書き込む前にゼロバイトに切り捨てます。

しかし、、これbash手動リダイレクトセクション追加:

2つの形式のうち、最初の形式が好ましい。これは意味上次のとおりです。

>word 2>&1

2番目のフォームを使用すると、言葉数字で拡張することはできません-。その場合、互換性の理由から他のリダイレクト演算子が適用されます(下記のファイル記述子のコピーを参照)。

したがって、表示するときにzsh誰かがスクリプトを作成する場合は、最初の形式で指の記憶を取得するのが良い習慣かもしれませんbash

>> logfile 2>&1そして&>>それに対応するもの(追加)

ここではlogfile、上書きするのではなく、ファイルの最後に書き込みが開きます。つまり、追加モード(O_APPEND)です。

2つに該当するものは次のとおりです{ba,z}sh

command1 &>> logfile

存在するbash

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

&>>word

これは意味上次のとおりです。

>>word 2>&1

(下記のファイル記述子のコピーを参照)

(注:追加方法は1つだけなので、上記のセクションではoverを使用することをお勧めします&>。)>&bash

zsh&>>使用とフォーマットの両方が>>&許可されます。

関連情報