web-dev-qa-db-ja.com

このbashコマンドでアンパサンドは何を示していますか1>&2

簡単な方法ですが、2>&1はstderrをstdoutにリダイレクトしますが、アンパサンドとはどういう意味ですか? 2 > 1があれば、1という名前のファイルに出力されることはわかっていますが、アンパサンドは何をしますか?

36
mikip

ファイル記述子1をファイル記述子2にコピーします。FD2はstderrであり、FD1はstdoutであるため、stderrへの出力はすべてstdoutに送られます。

2>&1標準エラー(ファイルハンドル2)を、標準出力(ファイルハンドル1)が移動するのと同じファイルにリダイレクトします現在

これも位置に依存するものなので、次のようになります。

prog >x 2>&1 >y

次のように、実際には標準エラーをxに送信し、標準出力をyに送信します。

  • 標準出力をxに接続します。
  • 次に標準エラーを現在の標準出力と同じに接続します。これはxです。
  • 次に標準出力をyに接続します。
63
paxdiablo

&&1は、ファイル記述子1を複製します。複製された記述子は、実際にはコピーのようには動作しませんが、古い記述子のエイリアスのように動作します。 1を複製すると、複数のストリームを互いに上書きせずに1にリダイレクトできます。

例:(&なし)

$ ls existing-file non-existent-file > tmp 2> tmp 
$ cat tmp
existing-file
nt-file: No such file or directory

12が書いたものを上書きしたことに注意してください。しかし、&を使用する場合はそうではありません:

$ ls existing-file non-existent-file > tmp 2>&1 
$ cat tmp
ls: non-existent-file: No such file or directory
existing-file

ファイル記述子は、ファイル(またはパイプやネットワークソケットなどの他の入出力リソース)へのハンドルです。 12が別々にtmpにリダイレクトされると(最初の例のように)、それらはtmpファイルポインターを個別に移動します。これが、ファイル記述子が相互に上書きした理由です。

Linuxのマニュアルページ によると:

[重複ファイル記述子]は同じオープンファイルの説明を参照するため、ファイルオフセットとファイルステータスフラグを共有します。たとえば、一方の記述子でlseek(2)を使用してファイルのオフセットを変更すると、もう一方の記述子のオフセットも変更されます。

&はエイリアスのように機能しますが、2>&1は、currently2が指すストリームに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
17
Rose Perrone

アンパサンドは「1」に属しているため、スニペットは実際には「2」、「>」、「&1」の3つの部分で構成されます。それぞれ、「出力ストリーム2(標準エラー)からデータを取得する」、「リダイレクトする」、および出力ストリーム1であるリダイレクトターゲットを意味します。したがって、ここでの「&」を使用すると、既存のストリームにリダイレクトできます。 、ファイルではなく。

17
sleske

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に複製します。

7
Douglas Leeder

ampersandは何もしません-それ自体ではなく、2>&1演算子の文字です。

bashはいくつかの リダイレクト演算子 をサポートし、2>&1演算子または&>演算子は、リダイレクトの前後にプロセスのストリームを結び付けます。

0
Pete Kirkham