簡単な方法ですが、2>&1
はstderrをstdoutにリダイレクトしますが、アンパサンドとはどういう意味ですか? 2 > 1
があれば、1
という名前のファイルに出力されることはわかっていますが、アンパサンドは何をしますか?
ファイル記述子1をファイル記述子2にコピーします。FD2はstderrであり、FD1はstdoutであるため、stderrへの出力はすべてstdoutに送られます。
2>&1
標準エラー(ファイルハンドル2)を、標準出力(ファイルハンドル1)が移動するのと同じファイルにリダイレクトします現在。
これも位置に依存するものなので、次のようになります。
prog >x 2>&1 >y
次のように、実際には標準エラーをx
に送信し、標準出力をy
に送信します。
x
に接続します。x
です。y
に接続します。&
の&1
は、ファイル記述子1
を複製します。複製された記述子は、実際にはコピーのようには動作しませんが、古い記述子のエイリアスのように動作します。 1
を複製すると、複数のストリームを互いに上書きせずに1
にリダイレクトできます。
例:(&
なし)
$ ls existing-file non-existent-file > tmp 2> tmp
$ cat tmp
existing-file
nt-file: No such file or directory
1
は2
が書いたものを上書きしたことに注意してください。しかし、&
を使用する場合はそうではありません:
$ ls existing-file non-existent-file > tmp 2>&1
$ cat tmp
ls: non-existent-file: No such file or directory
existing-file
ファイル記述子は、ファイル(またはパイプやネットワークソケットなどの他の入出力リソース)へのハンドルです。 1
と2
が別々にtmp
にリダイレクトされると(最初の例のように)、それらはtmp
ファイルポインターを個別に移動します。これが、ファイル記述子が相互に上書きした理由です。
Linuxのマニュアルページ によると:
[重複ファイル記述子]は同じオープンファイルの説明を参照するため、ファイルオフセットとファイルステータスフラグを共有します。たとえば、一方の記述子でlseek(2)を使用してファイルのオフセットを変更すると、もう一方の記述子のオフセットも変更されます。
&
はエイリアスのように機能しますが、2>&1
は、currentlyの2
が指すストリームに1
をリダイレクトすることを意味します。 1
が別の場所にリダイレクトされると、2
は、1
とは独立して行ったのと同じファイルを指します。
観察する:
$ ls existing-file non-existent-file > tmp 2>&1 > tmp1
$ cat tmp1
existing-file
$ cat tmp
ls: non-existent-file: No such file or directory
アンパサンドは「1」に属しているため、スニペットは実際には「2」、「>」、「&1」の3つの部分で構成されます。それぞれ、「出力ストリーム2(標準エラー)からデータを取得する」、「リダイレクトする」、および出力ストリーム1であるリダイレクトターゲットを意味します。したがって、ここでの「&」を使用すると、既存のストリームにリダイレクトできます。 、ファイルではなく。
info bash
から:
3.6.7 Duplicating File Descriptors
----------------------------------
The redirection operator
[N]<&Word
is used to duplicate input file descriptors. If Word expands to one
or more digits, the file descriptor denoted by N is made to be a copy
of that file descriptor. If the digits in Word do not specify a file
descriptor open for input, a redirection error occurs. If Word
evaluates to `-', file descriptor N is closed. If N is not specified,
the standard input (file descriptor 0) is used.
The operator
[N]>&Word
is used similarly to duplicate output file descriptors. If N is not
specified, the standard output (file descriptor 1) is used. If the
digits in Word do not specify a file descriptor open for output, a
redirection error occurs. As a special case, if N is omitted, and Word
does not expand to one or more digits, the standard output and standard
error are redirected as described previously.
したがって、2>&1
はfd1をfd2に複製します。
ampersandは何もしません-それ自体ではなく、2>&1
演算子の文字です。
bashはいくつかの リダイレクト演算子 をサポートし、2>&1
演算子または&>
演算子は、リダイレクトの前後にプロセスのストリームを結び付けます。