Bash

>> /dev/stderr(帶空格)和>&2有什麼區別?

  • December 22, 2016

在重擊中。

我很難確定我應該使用什麼?

我所有的腳本都使用“>>/dev/stderr”

在 bash 提示符下,如果我嘗試:

echo test >>/dev/stderrworks

echo test >> /dev/stderrworks

echo test >/dev/stderrworks

echo test > /dev/stderrworks

echo test >>&2失敗!

echo test >> &2失敗!

echo test >&2工作

echo test > &2失敗!

我願意將所有腳本更改為>&2.

它似乎對 ssh (之後su SomeUser)也有很大的影響,它>>/dev/stderr根本不起作用(權限被拒絕),只會>&2起作用。

>& *n*直接複製文件描述符的 shell 語法。文件描述符 2 是 stderr;這就是它的工作原理。您也可以複製其他文件描述符,而不僅僅是 stderr。您不能在此處使用附加模式,因為複製文件描述符永遠不會截斷(即使您的 stderr 是一個文件)並且>&是一個標記,這就是為什麼您不能在其中放置空格 - 但>& 2可以。

>> *name*是一種不同的允許語法,其中*name*是文件名(並且標記是>>)。在這種情況下,您使用的是文件名/dev/stderr,通過特定於作業系統的處理(在 Linux 上,它是 的符號連結/proc/self/fd/2)也意味著標準錯誤。當 stderr 是終端時,追加和截斷模式都會做同樣的事情,因為它不能被截斷。但是,如果您的標準錯誤是一個文件,它將被截斷:

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

如果您看到/dev/stderrover ssh 出現錯誤,則可能是伺服器管理員應用了一些安全措施,阻止該符號連結工作。(例如,您無法訪問/proc/dev)。雖然我預計這會導致各種奇怪的破壞,但使用重複的文件描述符語法是一種完全合理(並且可能更有效)的方法。我個人更喜歡它。

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