Bash

>&2 和 &>2 有什麼區別

  • May 15, 2018

只是想知道是否有任何區別:

 echo "running the npm patch" >&2;

echo "running the npm patch" &>2;

我實際上從來沒有真正理解過這種語法。

仔細閱讀手冊的重定向部分:https ://www.gnu.org/software/bash/manual/bashref.html#Redirections


cmd >&2表格在“3.6.8 複製文件描述符”一節中進行了描述

[n]>&word

此處n未指定,因此預設為“1”,表示標準輸出:我們將標準輸出重定向到文件描述符“2”,表示標準錯誤。該命令的所有正常輸出都將發送到 stderr。


cmd &>2形式在“3.6.4 重定向標準輸出和標準錯誤”一節中描述

重定向標準輸出和標準錯誤有兩種格式:

&>word

>&word

在這兩種形式中,首選第一種。這在語義上等價於

>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目前使用的 .

請注意,我的術語可能是錯誤的(“指向”等)。這就是我記得重定向是如何工作的。

引用自:https://unix.stackexchange.com/questions/443823