經常可以在一些腳本,尤其是在crontab調用時發現如下形式的命令調用
./t.sh >/dev/null 2>&1
前半部分./t.sh >/dev/null很容易理解,那麼後面的2>&1是怎麼回事呢?
要解釋這個問題,還是得提到文件重定向。我們知道>和<是文件重定向符。那麼1和2是什麼?在shell中,每個進程都和三個系統文件相關聯:標准輸入stdin,標准輸出stdout和標准錯誤stderr,三個系統文件的文件描述符分別為0,1和2。所以這裡2>&1的意思就是將標准錯誤也輸出到標准輸出當中。
下面通過一個例子來展示2>&1有什麼作用:
1234 $ cat ./t.sh#!/usr/bin/zshttttttecho "test"
t.sh中包含兩個命令,其中tttttt是一個不存在的命令,執行會報錯,默認情況下,錯誤會輸出到stderr。echo則能正確執行,並且輸出字符串信息到stdout。這裡標准輸出已經重定向到了 /dev/null。那麼標准錯誤也會輸出到/dev/null
為何2>&1要寫在後面?
首先是./t.sh >/dev/null 2>&1將標准輸出重定向到/dev/null中, 2>&1 是標准錯誤拷貝了標准輸出的行為,也就是同樣被重定向到file中,最終結果就是標准輸出和錯誤都被重定向到file中。 ./t.sh 2>&1 >/dev/null 中 2>&1 標准錯誤拷貝了標准輸出的行為,但此時標准輸出還是在終端。>/dev/null後輸出才被重定向到/dev/null,但標准錯誤仍然不會被改變到/dev/null
測試結果如下:
1234567891011121314 ➜ workspace ./t.sh ./t.sh:2: command not found: ttttttest➜ workspace ./t.sh >/dev/null./t.sh:2: command not found: ttttt➜ workspace ./t.sh ./t.sh:2: command not found: ttttttest➜ workspace ./t.sh >/dev/null./t.sh:2: command not found: ttttt➜ workspace ./t.sh >/dev/null 2>&1➜ workspace ./t.sh 2>&1 /dev/null./t.sh:2: command not found: ttttttest