tee 指令:同時輸出到螢幕和檔案
在 Linux 系統管理的日常工作中,我們經常需要將指令的輸出結果記錄下來以便後續分析,但同時又希望在執行當下即時看到結果,以確認指令是否按預期運作。例如,當你在部署伺服器或執行大型腳本時,若輸出被完全重定向至檔案,一旦出現錯誤將難以即時察覺;反之,若僅顯示在螢幕上,事後又無從查證。
這時,tee 指令便成為了不可或缺的利器。它的名稱來自於管線中的 T 型接頭,形象地描述了它將資料流「分流」的特性。本文將深入解析 tee 的用法、核心選項與實際應用場景,幫助你更高效地處理 Linux 輸出。
什麼是 tee?
tee 指令的基本功能是讀取標準輸入(Standard Input),並將內容同時寫入到標準輸出(Standard Output,即螢幕)以及一個或多個檔案中。這意味著你可以透過管線符號 | 將前一個指令的結果傳遞給 tee,從而實現「既顯示又儲存」的效果。
其基本語法非常簡單:
[command] | tee [file]
核心選項解析
雖然 tee 的基礎用法直觀,但幾個關鍵選項能大幅提升其靈活性:
-a或--append:這是tee最實用的選項。預設情況下,tee會覆蓋(overwrite)目標檔案的內容。加上-a後,它會將新內容追加(append)到檔案末尾,而非刪除原有數據。這對於日誌記錄(Log)至關重要。-i或--ignore-interrupts:忽略中斷訊號(如 Ctrl+C)。這在處理長時間運行的指令時非常有用,防止因意外中斷導致資料損毀或不完整。--output-error=[MODE]:控制當寫入檔案失敗時的行為。預設行為可能因版本而異,但通常建議明確指定以確保穩定性。
實際範例演示
以下範例均基於 Ubuntu 22.04 或 Debian 12 環境測試。
範例一:基礎用法——同時顯示與儲存
假設我們想查看當前目錄下的詳細檔案列表,並將結果保存至 ls_output.txt。
ls -l /etc | tee ls_output.txt
執行後,你會看到螢幕上立即滾動顯示 /etc 目錄的內容,同時 ls_output.txt 檔案會被建立並包含完全相同的內容。你可以使用 cat ls_output.txt 驗證檔案內容。
範例二:追加模式——日誌記錄的最佳夥伴
若我們多次執行上述指令,預設的 tee 會清空舊檔案。為了保留歷史記錄,我們必須使用 -a 選項。
# 第一次執行,建立檔案並寫入
ls -l /var | tee log1.txt
# 第二次執行,追加內容到同一檔案
ls -l /tmp | tee -a log1.txt
此時檢查 log1.txt,你會發現它包含了兩次 ls 指令的結果,而非僅有最後一次。這對於持續監控系統狀態或記錄部署步驟的日誌極具價值。
範例三:多重輸出——一份資料,多個去向
tee 支援多個檔案參數。你可以將同一份輸出同時保存至多個檔案,甚至結合管線進行進一步處理。
# 將輸出同時存入 file1.txt 和 file2.txt
echo "Hello, Linux World" | tee file1.txt file2.txt
# 進階用法:輸出到檔案,並同時過濾出包含 "World" 的行顯示在螢幕上
echo -e "Hello Linux\nHello World\nGoodbye" | tee debug.log | grep "World"
在最後一個範例中,debug.log 會包含所有三行文字,而螢幕上僅顯示過濾後的 "Hello World"。這種技巧在除錯(Debug)時非常實用,既能保留原始數據,又能快速聚焦關鍵資訊。
範例四:處理權限問題
當你需要將輸出寫入到需要 root 權限的目錄(如 /var/log)時,直接執行 sudo tee 是常見做法,但需注意管線的權限傳遞問題。
# 正確做法:將 sudo 套用在 tee 上
echo "System update completed" | sudo tee /var/log/system_update.log
若嘗試 sudo echo "text" > /var/log/file,會因 Shell 的管線處理順序導致權限錯誤,而 tee 配合 sudo 是解決此問題的標準解法。
常見問題
Q1: 為什麼我的輸出沒有寫入到檔案?
最常見的原因是遺漏了 tee 指令,或誤以為重定向符號 > 能同時顯示在螢幕上。請確認指令結構為 [command] | tee [file]。此外,若檔案路徑無寫入權限,請檢查路徑是否存在以及使用者權限,或使用 sudo。
Q2: 如何避免 tee 覆蓋重要日誌?
務必養成使用 -a(append)選項的習慣,特別是對於日誌檔案。若不慎使用覆蓋模式,可考慮在腳本中加入檢查機制,或使用 rsync 等工具進行備份。另外,對於關鍵系統日誌,建議定期輪轉(Log Rotation)以避免檔案過大。
小結
tee 指令雖看似簡單,卻是 Linux 管線操作中提升工作效率的關鍵工具。它解決了「即時檢視」與「持久化儲存」之間的矛盾,特別適合用於除錯、日誌記錄和資料備份場景。掌握 -a 追加模式與多重輸出技巧,能讓你在處理複雜管線時更加得心應手。下次當你需要同時觀察與記錄輸出時,別忘了這個強大的 T 型接頭!