Bash
>&2 和 &>2 有什麼區別
只是想知道是否有任何區別:
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目前使用的 .
請注意,我的術語可能是錯誤的(“指向”等)。這就是我記得重定向是如何工作的。