[學習筆記] Linux Command 「2>&1」 輕鬆談

Photo by Sai Kiran Anagani on Unsplash

老實說對於 2>&1 的問題,已經困惑好一陣子了,不少教學書集,以及網路上的指令用法,都包含這麼一段,但實在是搞不清楚為什麼要加上這個,甚至上網 Google 到的答案,也似乎沒有太淺顯易懂,該篇就來探討這個奇葩的指令後輟吧,並且簡單的紀錄學習過程。

目錄

前言

首先該指令是 Linux Shell 中常見的指令,在 Windows 沒有這種用法,除非使用 WSL(Windows Subsystem for Linux),不過就算使用 WSL 也相當於使用 Linux。

若是想安裝 Linux 的朋友也可以參考之前發過的安裝教學文章「[系統重灌] Install Linux Fedora 21」。

探究 2>&1

首先了解數字的定義,分別有 012 三組數字,其中代表的意義如下。

  1. 代表鍵盤輸入(stdin)
  2. 代表銀幕輸出(stdout)
  3. 代表錯誤輸出(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 的檔案中。
Linux Command

2>&1

但若將指定的 1 變更成 &1 指向的就不是檔案,而是 1:銀幕輸出(stdout),簡單的說可以參考下方的執行實例。

2 >&1 的錯誤用法

聰明的各位一定會覺得,這樣有加跟沒加不是一樣嗎…,沒有錯,因為不是這樣用的。

關於 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

fgbg 相反,是將背景程序調到前台,使用率滿高的。

額外補充

關於網上不少例子都會搭配 /dev/null 來使用 2>&1,其中的 /dev/null 是個有趣的東西,就像黑洞一樣,不論寫入什麼值,永遠都會是空檔案。

舉個例子 ./binary > /dev/null 2>&1,簡單的說就是將 binary 程式所執行的結果,包含錯誤訊息都丟到黑洞裡,不做任何輸出。

參考資料

[分享] 研究 2 >&1 後的一點點心得
/dev/null wiki

MksYi

透過網路分享知識的學習者。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料