2011-10-08 21 views
3

我當使用Bourne Shell中遇到一個奇怪的命令:「>&」是什麼意思,後跟一個文件名?

echo 123 >& result

通常我希望像echo 123 > result 2>&1,我從來沒有期望>&之後將一個文件名。

但令我吃驚的是,當我在shell中執行此命令時,結果是正確的,它確實創建了一個名爲「result」的文件,並且此文件包含文本「123」。

我很困惑這個語法。任何人都可以向我解釋這個嗎?

回答

2

這是一個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 
+0

是的,這是一個100%正確的答案,謝謝 – wangshuaijie

+0

我也發現csh不支持2>&1,所以使用>&是將stderr重定向到csh中的標準輸出的一種可行的方法。 – wangshuaijie

1

STDOUT的文件描述符爲1,默認情況下使用該描述符,如果您沒有明確提及任何文件描述符。所以,如果我沒有記錯echo 123 >& result是相同echo 123 1>&1 result

+0

所以這裏'&'實際上是多餘的,因爲它只是重定向標準輸出到標準輸出? – Sujoy

+0

我測試過它,它似乎不是真的。 'echo 123>&x'輸出'123'到一個名爲'x'的文件 – Lekensteyn

+0

你的猜測是錯誤的。這個語法是一個bashism,會影響stderr的輸出。 – jlliagre

1

案件告破:

echo 123 >& result相當於echo 123 > result 2>&1

+0

請分享你是如何測試它的? –

+0

@Aziz謝赫我偶然寫了一個程序,它輸出的東西到標準錯誤,你可以這樣寫: 的#include INT主(INT ARGC,字符** argv的) { fprintf中(標準輸出,「這會標準輸出\ n「); fprintf(stderr,「這會去stderr \ n」); return 0; }並編譯它以獲得a.out,當您調用./a.out>結果時,當您調用./a時,將看到「stdout」行將出現在結果文件中,並且「stderr」行出現在屏幕上.out>&result,你會發現結果中會出現「stdout」和「stderr」這兩行。 – wangshuaijie

+0

不需要使用C,你可以用一個簡單的shell命令來做同樣的事情(請參閱我的回覆)。 – jlliagre