詳解shell程式設計中2 1用法

2021-09-07 09:34:47 字數 1796 閱讀 6914

在使用 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...