在很多定時任務裡、shell裡我們往往能看到 「2>&1」,卻不知道這背後的原理。舉個例子:
* 1 * * * test.sh > /dev/null 2>
&1
這裡的」2>&1「的意思是把標準錯誤重定向到標準輸出。
0:代表標準輸入
1:代表標準輸出
2:代表標準錯誤
上面的例子"2>&1"已經知道是將標準錯誤重定向到標準輸出,而test.sh的標準輸出就是/dev/null,所以這條語句的結果(標準輸出、標準錯誤)都會打到/dev/null。
用c來表示可以更加清楚細節:
int fd =
open
("/dev/null"
,"w+");
dup2
(fd,1)
; # 將標準輸出重定向至/dev/null
dup2(1
,2); # 將標準錯誤重定向至標準輸出
我們調換一下/dev/null和2>&1的位置:
* 1 * * * test.sh 2>
&1 > /dev/null
這裡表示先將標準錯誤重定向至標準輸出,再將標準輸出重定向至/dev/null。這樣的結果就是還能看見標準錯誤
用c來表示下細節:
int fd =
open
("/dev/null"
,"w+");
dup2(1
,2); # 將標準錯誤重定向至標準輸出
dup2
(fd,1)
; # 將標準輸出重定向至/dev/null
可能看了上面的例子還是一臉懵圈,我舉幾個例子:
# 假設table不存在
ls table 2>
&1 # 報錯,並在標準輸出(終端)展示
ls table > /dev/null 2>
&1 # 報錯,標準錯誤重定向到標準輸出。而標準輸出被/dev/null給佔據了,所以錯誤進了/dev/null
ls table 2>
&1 > /dev/null
# 報錯,標準輸出指向/dev/null。而標準錯誤任然重定向至標準輸出,所以能在終端看到錯誤輸出
Linux中重定向
1重定向 1.1 重定向符號 輸出重定向到乙個檔案或裝置 覆蓋原來的檔案 輸出重定向到乙個檔案或裝置 強制覆蓋原來的檔案 輸出重定向到乙個檔案或裝置 追加原來的檔案 輸入重定向到乙個程式 1.2標準錯誤重定向符號 2 將乙個標準錯誤輸出重定向到乙個檔案或裝置 覆蓋原來的檔案 b shell 2 將乙...
Linux中的重定向
1.輸出重定向 command filename 把標準輸出重定向到乙個新檔案中,當filename不存在時 command filename 把標準輸出重定向到乙個檔案中 追加 command filename 2 1 把標準輸出和錯誤一起重定向到乙個檔案中 command filename 2 ...
Linux中的重定向
標準輸入流 stdin 標準輸出流 stdout 標準錯誤 stderr 三個資料流其實就是三個檔案 在linux中檔案是具備檔案描述符的 比如0 1 2,分別對應上面三個流,其他的檔案都是從3開始標號的以此類推,都指向了終端,重定向就是改變其指向。符號 一般是指將輸出的結果指引到某個檔案。比如 l...