>> /dev/stderr
(帶空格)和>&2
有什麼區別?
在重擊中。
我很難確定我應該使用什麼?
我所有的腳本都使用“>>/dev/stderr”
在 bash 提示符下,如果我嘗試:
echo test >>/dev/stderr
works
echo test >> /dev/stderr
works
echo test >/dev/stderr
works
echo test > /dev/stderr
works
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/stderr
over ssh 出現錯誤,則可能是伺服器管理員應用了一些安全措施,阻止該符號連結工作。(例如,您無法訪問/proc
或/dev
)。雖然我預計這會導致各種奇怪的破壞,但使用重複的文件描述符語法是一種完全合理(並且可能更有效)的方法。我個人更喜歡它。