在我們接觸的 shell 指令碼中,對 2>&1 一定不陌生,比如 ls foo > /dev/null 2>&1。
本文就來解釋下 2>&1 究竟做了什麼,並且是如何起作用的。
「重定向」是計算機用來把命令的輸出從乙個地方,輸出到另乙個地方。舉個例子,預設情況下,我們使用 cat 指令可以把乙個檔案的內容列印到終端:
$ cat foo.txtfoobar
baz
但是,我們可以把輸出重定向到另外地方。此例中,我們可以把輸出重定向到 output.txt 中:
$ cat foo.txt >output.txt$ cat output.txt
foobar
baz
注意,在執行第一行命令 cat foo.txt > output.txt 時,我們在螢幕上看不到任何輸出。我們把原來應該列印到螢幕的內容,重定向到 output.txt 了,所以螢幕上不會有任何輸出了。
這裡,「本來應該列印到螢幕的內容」,就是標準輸出,即 stdout(standard output)。
除了標準輸出可以接收程式的輸出之外,還有乙個地方可以,叫 標準錯誤輸出,即 stderr(standard error)。stderr 用來接收程式的錯誤訊息。例如,我們 cat 了乙個不存在的檔案:
$ cat nop.txt >output.txtcat: nop.txt: no such file or directory
我們看到,雖然我們要求程式把輸出重定向到 output.txt,但是我們還是在螢幕上看到了錯誤訊息輸出。這是因為我們只是重定向了 standard output,而不是 standard error。
檔案描述符(file descriptor)簡單來說,就是乙個正整數,用來代表乙個開啟的檔案。比如當前我們有 100 各開啟的檔案,那麼就有 100 個檔案描述符。
唯一需要補充的是,在 unix 系統中,「一切皆檔案」。
同時我們還應該知道,對於標準輸出 (stdout) 和標準錯誤輸出 (stderr),也有對應的檔案描述符。我們使用 1 和 2 來分別表示 stdout 和 stderr 所在的位置。
回到我們的第乙個示例,我們還可以有另外一種寫法
# 寫法一$ cat foo.txt >output.txt
# 等價寫法二
$ cat foo.txt
1> output.txt
這裡的 1 就是用來代表 stdout 的檔案描述符。語法是 [file_descriptor]>。我們看到把 1 省略的寫法 > 只是 1> 的快捷寫法而已。
對於重定向到 stderr 的場景,我們只需要在右邊的檔案前面加上檔案描述符即可
$ cat nop.txt 2>error.txt$ cat error.txt
cat: nop.txt: no such file or directory
你看,這樣就生效了。這會兒,你大概知道 2>&1 是怎樣工作的,讓我們來總結總結。
我們使用 &1 來表示檔案描述符 1 (stdout) 的位址。當你使用 2>&1 時,其實就是在說:把 stderr 的輸出重定向到 stdout 的地方。這樣,我們就可以把程式的標準輸出和錯誤輸出都輸出到同乙個地方了。
$ cat foo.txt > output.txt 2>&1$ cat output.txt
foobar
baz$ cat nop.txt > output.txt 2>&1
$ cat output.txt
cat: nop.txt: no such file or directory
shell指令碼中if語句的用法
分享下shell中if語句的用法。一,if語句 1.if與 之間要有空格 2.與判斷條件之間也必須有空格 3.與 之間不能有空格 二,字串 判斷 1.if str1 str2 then fi 當兩個字串相同時返回真 2.if str1 str2 then fi 當兩個字串不相等時返回真 3.if n...
shell指令碼中for while用法
1 for迴圈 for迴圈的運作方式,是講序列的元素意義取出,依序放入指定的變數中,然後重複執行含括的命令區域 在do和done 之間 直到所有元素取盡為止。for的語法結構如下 for 變數 in 序列 do 執行命令 done例1 用for迴圈在家目錄下建立a1 a10,然後在a1 a10建立b...
Shell 指令碼中 符號的多種用法
jacktian 杰哥的it之旅 通常情況下,在工作中用的最多的有如下幾項 0 shell 的命令本身 1 到 9 表示 shell 的第幾個引數 顯示最後命令的執 況 傳遞到指令碼的引數個數 指令碼執行的當前程序 id 號 以乙個單字串顯示所有向指令碼傳遞的引數 後台執行的最後乙個程序的 id 號...