老實說對於 2>&1 的問題,已經困惑好一陣子了,不少教學書集,以及網路上的指令用法,都包含這麼一段,但實在是搞不清楚為什麼要加上這個,甚至上網 Google 到的答案,也似乎沒有太淺顯易懂,該篇就來探討這個奇葩的指令後輟吧,並且簡單的紀錄學習過程。
前言
首先該指令是 Linux Shell 中常見的指令,在 Windows 沒有這種用法,除非使用 WSL(Windows Subsystem for Linux),不過就算使用 WSL 也相當於使用 Linux。
若是想安裝 Linux 的朋友也可以參考之前發過的安裝教學文章「[系統重灌] Install Linux Fedora 21」。
探究 2>&1
首先了解數字的定義,分別有 0
、1
、2
三組數字,其中代表的意義如下。
- 代表鍵盤輸入(stdin)
- 代表銀幕輸出(stdout)
- 代表錯誤輸出(stderr)
舉個例子如下:
cat error_file 2>&1 &
2>1
首先可以先將指令化繁為簡,將 2>&1 &
獨立拆開,先來探討 2>1
的狀態,該地方的 2
指的就是上述所提及的 2:錯誤輸出
,則後方的 1
表示檔案。
- (指令1)首先
error_file
並不存在,輸入指令cat error_file
便會發生錯誤。 - (指令2)接著輸入包含
2>log
的指令,就是把「錯誤訊息」輸出到log
這個檔案,若把log
換成1
也是相同意思,僅是把錯誤訊息輸出到名稱為1
的檔案中。 - (指令3)接著透過
cat log
查看log
的內容,會發現錯誤訊息被存在log
的檔案中。
2>&1
但若將指定的 1
變更成 &1
指向的就不是檔案,而是 1:銀幕輸出(stdout)
,簡單的說可以參考下方的執行實例。
聰明的各位一定會覺得,這樣有加跟沒加不是一樣嗎…,沒有錯,因為不是這樣用的。
關於 2>&1
的用法,是需要搭配其它指向指令,舉一個新的例子如下,首先檔案 test
檔案並不存在,執行 ls test
必定會發生錯誤,如果指向 log
檔案,會發現並沒有將「錯誤訊息」
存入,log
檔案中。
當然也可以直接使用 2>log
的方式存入 log
,但今天的主角是常出現在各個世界角落的 2>&1
,若是同樣要將錯誤訊息存入 log
中的話,可參考以下例子。
- (指令1)使用
cat test > log 2>&1
時,並沒有任何錯誤訊息。 - (指令2)
cat log
時,可以看見錯誤訊息已經存入log
檔案中。
&
別忘最後面還有一個符號 &
,其該符號為 Linux 背景執行的意思,任何指令都可以使用,僅要在指令的最後面加上 &
就能讓該指另在背景作業。
jobs
jobs
指令可以查看該 Terminal
的背景程序有哪些,並且提供後續操作。
bg
bg
功能描述是將 jobs 調到背景執行,該指令平常比較不常用到,也沒有需要用到的經驗。
通常在執行的狀態下都是使用快捷鍵 Ctrl+z
來讓程序執行到背景,若是還沒執行則在指令最後方加上 &
即可。
fg
fg
與 bg
相反,是將背景程序調到前台,使用率滿高的。
額外補充
關於網上不少例子都會搭配 /dev/null
來使用 2>&1
,其中的 /dev/null
是個有趣的東西,就像黑洞一樣,不論寫入什麼值,永遠都會是空檔案。
舉個例子 ./binary > /dev/null 2>&1
,簡單的說就是將 binary
程式所執行的結果,包含錯誤訊息都丟到黑洞裡,不做任何輸出。