>&2と&>2の違いは何ですか[重複]

>&2と&>2の違いは何ですか[重複]

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

  echo "running the npm patch" >&2;

そして

 echo "running the npm patch" &>2;

私は実際にこの構文をまったく理解していませんでした。

ベストアンサー1

ドキュメントのリダイレクトセクションをよく読んでください。https://www.gnu.org/software/bash/manual/bashref.html#Redirections


このcmd >&2フォームは、「3.6.8ファイル記述子のコピー」セクションで説明されています。

[n]>&word

ここではn指定されていないので、デフォルトはstdoutを意味する「1」です。 stdout を stderr を意味するファイル記述子 "2" にリダイレクトします。コマンドのすべての一般出力は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が現在使用しているものを変更します。

変えたいなら注文するリダイレクトを実行すると、別の結果が得られます。

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

fd 2を変更したので最初それからfd 1をfd 2の位置にリダイレクト現在使用中

私の用語が間違っている可能性があります(「指す」など)。これが私がリダイレクトが機能していたことを覚えている方法です。

おすすめ記事