web-dev-qa-db-ja.com

>&2と&> 2の違いは何ですか

次の間に違いがあるかどうか疑問に思っています:

  echo "running the npm patch" >&2;

そして

 echo "running the npm patch" &>2;

私は実際にその構文を本当に理解したことがありません。

5
Alexander Mills

マニュアルの「リダイレクト」セクションを注意深くお読みください: https://www.gnu.org/software/bash/manual/bashref.html#Redirections


cmd >&2フォームについては、セクション「3.6.8ファイル記述子の複製」で説明しています。

[n]>&Word

ここでは、nは指定されていないため、デフォルトで「1」になり、stdoutを意味します。stdoutをファイル記述子「2」(stderrを意味する)にリダイレクトしています。コマンドからの通常の出力はすべてstderrに送信されます。


cmd &>2フォームについては、「3.6.4標準出力と標準エラーのリダイレクト」で説明しています。

標準出力と標準エラーのリダイレクトには2つの形式があります。

&>Word

そして

>&Word

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

>Word 2>&1

この場合、「Word」は「2」なので、コマンドのstdoutとstderrの両方が2という名前のファイルに送信されます。

$ sh -c 'echo stdout; echo stderr >&2' &>2
$ ls -l 2
-rw-rw-r-- 1 jackman jackman 14 May 14 21:40 2
$ cat 2
stdout
stderr

私が学んでいたとき、これはすべて非常に混乱していました。それを守ってください。リダイレクトは左から右の厳密な順序で行われることに注意してください。例えば

$ sh -c 'echo stdout; echo stderr >&2' >&2 2>some.file
stdout
$ cat some.file
stderr

「stdout」文字列がそのファイルに送信されないのはなぜですか?

左から右へ:

  • 1>&2-これは「ファイル記述子1を現在リダイレクトしているファイル記述子2にリダイレクトする」と考えています。現在、fd 2は/ dev/stderrを指しています。そのため、fd 1は/ dev/stderrも指します。
  • 2>some.file-名前付きファイルに書き込むようにfd 2を変更します。これはfd 1が現在使用しているものを変更しません

リダイレクトのorderを変更すると、異なる結果が得られます。

$ sh -c 'echo stdout; echo stderr >&2' 2>some.file >&2
$ cat some.file 
stdout
stderr

Fd 2firstを変更するためです。 次に、fd 1を現在使用しているfd 2にリダイレクトします

私の用語はおそらく間違っていることに注意してください(「ポイントする」など)。これは、リダイレクトがどのように機能するかを覚えている方法です。

9
glenn jackman