我當使用Bourne Shell中遇到一個奇怪的命令:「>&」是什麼意思,後跟一個文件名?
echo 123 >& result
通常我希望像echo 123 > result 2>&1
,我從來沒有期望>&
之後將一個文件名。
但令我吃驚的是,當我在shell中執行此命令時,結果是正確的,它確實創建了一個名爲「result」的文件,並且此文件包含文本「123」。
我很困惑這個語法。任何人都可以向我解釋這個嗎?
我當使用Bourne Shell中遇到一個奇怪的命令:「>&」是什麼意思,後跟一個文件名?
echo 123 >& result
通常我希望像echo 123 > result 2>&1
,我從來沒有期望>&
之後將一個文件名。
但令我吃驚的是,當我在shell中執行此命令時,結果是正確的,它確實創建了一個名爲「result」的文件,並且此文件包含文本「123」。
我很困惑這個語法。任何人都可以向我解釋這個嗎?
這是一個bash的擴展意味着重定向標準輸出和標準錯誤的結果文件。
可移植的方式來達到同樣與POSIX兼容的炮彈是:
echo 123 >bar 2>&1
爲「echo 123」是不太可能在stderr輸出任何東西,這句法是沒用在這裏。
下面是一個例子展示它的工作:
(echo stderr 1>&2;echo stdout) >& foo
(echo stderr 1>&2;echo stdout) >bar 2>&1
STDOUT的文件描述符爲1,默認情況下使用該描述符,如果您沒有明確提及任何文件描述符。所以,如果我沒有記錯echo 123 >& result
是相同echo 123 1>&1 result
所以這裏'&'實際上是多餘的,因爲它只是重定向標準輸出到標準輸出? – Sujoy
我測試過它,它似乎不是真的。 'echo 123>&x'輸出'123'到一個名爲'x'的文件 – Lekensteyn
你的猜測是錯誤的。這個語法是一個bashism,會影響stderr的輸出。 – jlliagre
案件告破:
echo 123 >& result
相當於echo 123 > result 2>&1
請分享你是如何測試它的? –
@Aziz謝赫我偶然寫了一個程序,它輸出的東西到標準錯誤,你可以這樣寫: 的#include
不需要使用C,你可以用一個簡單的shell命令來做同樣的事情(請參閱我的回覆)。 – jlliagre
是的,這是一個100%正確的答案,謝謝 – wangshuaijie
我也發現csh不支持2>&1,所以使用>&是將stderr重定向到csh中的標準輸出的一種可行的方法。 – wangshuaijie