Linux中的錯誤重定向你真的懂嗎

2021-10-02 02:12:53 字數 1297 閱讀 3911

在很多定時任務裡、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...