Linux I/O 重導向 (>, >>, 2>)

在 Linux 中,每一個執行的程式都有三個預設的資料流:

  1. 標準輸入 (stdin, 0):程式讀取資料來源的地方(預設是鍵盤)。
  2. 標準輸出 (stdout, 1):程式正常輸出結果的地方(預設是螢幕)。
  3. 標準錯誤 (stderr, 2):程式發生錯誤時顯示訊息的地方(預設也是螢幕)。

I/O 重導向 (Redirection) 就是要把這些資料流「轉向」到檔案或其他地方去。

常用符號

1. 輸出重導向 > (覆蓋)

將 stdout 轉向寫入到檔案。若檔案已存在,會 還原 (清空) 檔案內容後寫入。

# 將 ls 的結果存到 file.txt (螢幕上不會顯示)
ls > file.txt

2. 輸出重導向 (附加) >> (Append)

將 stdout 轉向寫入到檔案。若檔案已存在,會接在原本內容的 最後面,不會清空檔案。

# 將日期時間「附加」到 log.txt 結尾
date >> log.txt

3.錯誤輸出重導向 2>

有時候程式噴錯了,我們不想看,或是想把錯誤紀錄分開存。 stderr 的代號是 2,所以用 2>

# 假設 xxx 指令不存在
# 錯誤訊息不會顯示在螢幕,而是存到 error.log
xxx 2> error.log

4. 全部重導向 &> (stdout + stderr)

不管正常結果還是錯誤訊息,通通存到同一個檔案。

command &> all_output.log

5. 輸入重導向 <

讓程式從檔案讀取資料,而不是從鍵盤。 最常用的例子就是 mysql 匯入資料庫。

mysql -u root -p database_name < backup.sql

實用技巧:丟到黑洞 (/dev/null)

Linux 有一個特殊的裝置檔案叫 /dev/null。 寫入它的所有東西都會消失不見(像黑洞一樣)。 當你不想看某些指令的輸出,也不想存檔時,就把它丟進黑洞。

# 執行指令,但我不care結果,什麼都不要顯示
command > /dev/null 2>&1
2>&1 的意思是「把 stderr (2) 導向到跟 stdout (1) 去的地方」,而 stdout 已經去了黑洞,所以兩個都去了黑洞。