在使用 linux 命令或者 shell 程式設計時,這個用法常會遇到 2>&1
下面看乙個命令示例,然後分析下他是如何工作的:
ls foo > /dev/null 2>&1
首先需要了解兩個基礎概念:i/o重定向、檔案描述符
i/o重定向
重定向 的作用是把乙個命令的輸出結果傳送到另乙個地方。
例如,使用 cat 命令檢視乙個檔案,檔案內容會被列印到螢幕 :
$ cat foo.txt
foobar
baz此時,螢幕就是命令的標準輸出( standard output 【stdout】)位置。
我們可以把檔案內容傳送到別的地方,例如,重定向到 output.txt 檔案中 :
$ cat foo.txt > output.txt
$ cat output.txt
foobar
baz其中第乙個 cat 使用 >把 stdout 的位置改為了另乙個檔案。
再看乙個例子,檢視乙個不存在的檔案:
$ cat nop.txt > output.txt
cat: nop.txt: no such file or directory
這裡的錯誤提示資訊為什麼顯示到了螢幕,而不是傳送到 output.txt 呢?
這就涉及到了另乙個位置:標準錯誤輸出standard error 【stderr】。
$ cat nop.txt > output.txt
這個命令是把 stdout 定位到了檔案,而沒有定義 stderr 的位置,所以錯誤資訊顯示到了預設的位置:螢幕。
檔案描述符
linux 中一切皆檔案,每個檔案都有乙個檔案描述符,值是個正整數。
所以,標準輸出stdout與 標準錯誤輸出stderr也有自己的檔案描述符:
stdout 為 1
stderr 為 2
綜合$ cat foo.txt > output.txt
實際上就是這樣的:
$ cat foo.txt 1> output.txt
就是把 stdout 指向了 output.txt,> 是 1> 的簡寫。
所以重定向錯誤資訊的輸出就應該是這樣的:
$ cat nop.txt 2> error.txt
$ cat error.txt
cat: nop.txt: no such file or directory
連個命令連起來就是:
$ cat foo.txt > output.txt 2> error.txt
同時重定向了標準輸出stdout與標準錯誤輸出stderr。
回顧開頭的那個命令:
ls foo > /dev/null 2>&1
現在基本上已經可以理解了:
stdout 重定向到 /dev/null
stderr 重定向到 &1
/dev/null 是空裝置的意思,重定向到空裝置,也就是輸出資訊不要了。
&1 表示:檔案描述符1 的值,也就是標準輸出的值,那麼 2>&1 就是 標準錯誤輸出 與 標準輸出 一樣,也是重定向到空裝置。
所以這個命令的意思是:正確資訊和錯誤資訊都不顯示了。
小結幾個關鍵點:
兩個輸出:標準輸出(stdout 正常資訊)、標準錯誤輸出(stderr 錯誤資訊)
> 可以改變輸出的位置
檔案描述符,stdout -> 1,stderr -> 2
command > output 是 command 1> output 的簡寫
&檔案描述符 是引用某個檔案描述符的值
2>&1 是錯誤輸出的位置與標準輸出的位置相同
shell 程式設計之2 1
經常可以在一些指令碼,尤其是在crontab呼叫時發現如下形式的命令呼叫 tmp test.sh tmp test.log 2 1 前半部分 tmp test.sh tmp test.log很容易理解,那麼後面的2 1是怎麼回事呢?要解釋這個問題,還是得提到檔案重定向。我們知道 和 是檔案重定向符。...
shell 程式設計之2 1
經常可以在一些指令碼,尤其是在crontab呼叫時發現如下形式的命令呼叫 tmp test.sh tmp test.log 2 1 前半部分 tmp test.sh tmp test.log很容易理解,那麼後面的2 1是怎麼回事呢?要解釋這個問題,還是得提到檔案重定向。我們知道 和 是檔案重定向符。...
shell指令碼中 dev null 2 1詳解
1,可以將 dev null看作 黑洞 它非常等價於乙個只寫檔案.所有寫入它的內容都會永遠丟失.而嘗試從它那兒讀取內容則什麼也讀不到.然而,dev null對命令列和指令碼都非常的有用.首先shell中0代表標準輸入 1代表標準輸出 2代表標準錯誤輸出 用處 禁止標準輸出.1 cat filenam...