
存在するこのスレッドstdout
そして他のスレッドでは、リダイレクトとstderr
ファイルに対する次のコマンドを見ました。
それらはすべて同等ですか?それらの間にどのような違いがありますか?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
答え1
ここでタグ付けしたので、zsh
3つのリダイレクトがすべてまったく同じように機能することをお知らせします。 2つの重複した投稿(コメント内の投稿と投稿内の投稿)を読み取ったように、両方とも「ログファイル」ファイルにリダイレクトされstderr
ますstdout
(つまり、ログファイルには出力とエラーが含まれます)。 )。
ただし、その動作は現在使用しているシェルによって大きく異なります。
bash
リダイレクトする3つの方法はすべて同じ方法でうまく機能します。zsh
しかし:
>&
またはのみ適用されますcsh
。tcsh
[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
。>&
エラーが発生しましたが、コマンド&>
の一部がバックグラウンドで実行され、ログファイルが消去されました(空でない場合)。
答え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
&>>
使用とフォーマットの両方が>>&
許可されます。