我知道0,1,2是STDIN,STDOUT和STDERR文件描述符。 我想了解重定向。 '>'表示轉儲到文件 '>>'表示追加瞭解重定向使用>&
但'&'是做什麼的? 以下命令的一步一步是什麼?
command > file 2>&1
command > file 2<&1
我知道0,1,2是STDIN,STDOUT和STDERR文件描述符。 我想了解重定向。 '>'表示轉儲到文件 '>>'表示追加瞭解重定向使用>&
但'&'是做什麼的? 以下命令的一步一步是什麼?
command > file 2>&1
command > file 2<&1
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)
。
2>&1
手段重定向STDERR
到同一個地方,STDOUT
打算。一個例子是有用的是grep
通常適用於STDOUT
這使得它在STDOUT
和STDERR
工作:
app 2>&1 | grep hello
我們來分析一下它一步一步:
>place
手段重新打開標準輸出,使它開始寫入place
,這是一個將要寫入的文件名。這是典型的重定向。
N>place
對於任意文件描述符n也是如此。例如,2>place
將標準錯誤文件描述符2重定向到place
。 1>place
與>place
相同。
如果位置是用特殊語法&N
寫的,它將被視爲現有的文件描述符號而不是文件名。因此,>&2
和1>&2
都意味着重新打開標準輸出寫入標準錯誤,而2>&1
則是相反的方式。
確切同樣適用於輸入,除了地方與各描述符被打開用於讀取,和文件描述符離開<
符號默認爲0,這表示標準輸入。 2<&1
的意思是「重新打開文件描述符2進行讀取,以便將來的讀取實際上從文件描述符1中讀取」。這在正常程序中是沒有意義的,因爲文件描述符1和2都是開放的用於寫入。
謝謝,它的好! – hack3r
還有一個問題,如果我給'command>&log',這裏'place'在特殊語法'&log'中,但它是一個字符串而不是0/1/2,所以'log'會被認爲是一個文件如果它不是0/1/2? – hack3r
@ hack3r在這種情況下''&'是特殊的,'log'只是一個文件。 '>&file'是'> file 2>&1'的縮寫,一些shell實現 - 它將stdout和stderr重定向到'file'。 – user4815162342
最後一句話是不正確的。 '2>&1'與'2 <&1'完全相同。在複製文件描述符時選擇'<' or '>'是無關緊要的,並且兩個重定向都具有完全相同的結果。 –
@WilliamPursell很好看,謝謝指出! – user4815162342
謝謝。我已經忘記了。 – alinsoar