2012-11-19 27 views
2

我知道0,1,2是STDIN,STDOUT和STDERR文件描述符。 我想了解重定向。 '>'表示轉儲到文件 '>>'表示追加瞭解重定向使用>&

但'&'是做什麼的? 以下命令的一步一步是什麼?

command > file 2>&1  
command > file 2<&1  

回答

4

NUMBER1>&NUMBER2表示分配文件描述符NUMBER2的文件描述符NUMBER1。

表示執行dup2 (NUMBER2, NUMBER1)

command > file 2>&1 

擊進程的命令行,它找到第一重定向>file,它改變標準輸出被寫入到file,然後繼續處理,並發現2>&1,和改變stderr的要被寫入到stdout(這是file在這一刻)。

command > file 2<&1  

這是一樣的,但2<&1從標準輸出重定向錯誤輸出到read。因爲沒有人從stderr讀取,所以第二次重定向通常不起作用。

但是,bash將這種特殊情況與2>&1相同,所以執行dup2 (1, 2)

What does "2<&1" redirect do in Bourne shell?

+2

最後一句話是不正確的。 '2>&1'與'2 <&1'完全相同。在複製文件描述符時選擇'<' or '>'是無關緊要的,並且兩個重定向都具有完全相同的結果。 –

+0

@WilliamPursell很好看,謝謝指出! – user4815162342

+0

謝謝。我已經忘記了。 – alinsoar

1

2>&1手段重定向STDERR到同一個地方,STDOUT打算。一個例子是有用的是grep通常適用於STDOUT這使得它在STDOUTSTDERR工作:

app 2>&1 | grep hello 
6

我們來分析一下它一步一步:

  • >place手段重新打開標準輸出,使它開始寫入place,這是一個將要寫入的文件名。這是典型的重定向。

  • N>place對於任意文件描述符n也是如此。例如,2>place將標準錯誤文件描述符2重定向到place1>place>place相同。

  • 如果位置是用特殊語法&N寫的,它將被視爲現有的文件描述符號而不是文件名。因此,>&21>&2都意味着重新打開標準輸出寫入標準錯誤,而2>&1則是相反的方式。

確切同樣適用於輸入,除了地方與各描述符被打開用於讀取,和文件描述符離開<符號默認爲0,這表示標準輸入。 2<&1的意思是「重新打開文件描述符2進行讀取,以便將來的讀取實際上從文件描述符1中讀取」。這在正常程序中是沒有意義的,因爲文件描述符1和2都是開放的用於寫入。

+0

謝謝,它的好! – hack3r

+0

還有一個問題,如果我給'command>&log',這裏'place'在特殊語法'&log'中,但它是一個字符串而不是0/1/2,所以'log'會被認爲是一個文件如果它不是0/1/2? – hack3r

+1

@ hack3r在這種情況下''&'是特殊的,'log'只是一個文件。 '>&file'是'> file 2>&1'的縮寫,一些shell實現 - 它將stdout和stderr重定向到'file'。 – user4815162342