Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux tee 指令完全攻略:管道分流、多檔寫入與錯誤流捕獲

編輯:關於 Linux

tee 是 Linux 管道操作中的「三通閥」:它從標準輸入讀取資料,同時寫入標準輸出與一個或多個檔案。掌握 tee 能讓你在終端機即時觀察輸出的同時,完整保存日誌、除錯資料或建立多份備份。

基本語法與常用參數

tee [選項] [檔案...]
參數長選項說明
-a--append附加模式:不覆蓋現有檔案,資料寫入檔案末尾
-i--ignore-interrupts忽略中斷訊號 (SIGINT,即 Ctrl+C)
--help顯示說明
--version顯示版本資訊

核心用法範例

1. 基本管道分流:螢幕顯示 + 存檔

ls -la | tee filelist.txt

終端機顯示目錄列表,同時完整寫入 filelist.txt。

2. 追加模式:累積多次命令輸出

echo "第一次執行" | tee -a log.txt
echo "第二次執行" | tee -a log.txt

log.txt 將包含兩行內容,不會被覆蓋。

3. 同時寫入多個檔案

cat important.log | tee backup1.txt backup2.txt backup3.txt

一份輸入同時存成三份備份,tee 也會輸出到螢幕。

4. 輸出到標準輸出多次 (鮮為人知的技巧)

echo "hello" | tee - - -

輸出三行 hello 到終端機。搭配 echo -n 可在同一行重複輸出。

5. 捕獲標準錯誤流 (stderr)

tee 預設只處理標準輸出 (stdout)。要同時捕獲錯誤輸出,需先將 stderr 重導向至 stdout:

# 正確寫法:先合併流再交給 tee
ls /notexist 2>&1 | tee error.log

# 錯誤寫法:管道只傳遞 stdout
ls /notexist | tee error.log  # error.log 會是空的

6. 互動式建立檔案

tee myinput.txt
# 輸入內容,每行 Enter 確認
# Ctrl+D (EOF) 結束輸入

輸入的每一行即時顯示於螢幕並寫入檔案。加上 -i 可防止 Ctrl+C 中斷,只能用 Ctrl+D 結束。

進階實戰場景

場景一:除錯腳本同時記錄完整日誌

#!/bin/bash
exec > >(tee -a /var/log/myscript.log) 2>&1
echo "腳本啟動 $(date)"
# ... 其餘腳本邏輯
./step1.sh
./step2.sh
echo "腳本結束 $(date)"

使用進程替換 >() 讓整個腳本的輸出 (含 stderr) 自動分流到日誌檔與終端機。

場景二:sudo 寫入需 root 權限的檔案

echo "new config line" | sudo tee -a /etc/nginx/nginx.conf > /dev/null

sudo tee 以 root 權限寫檔,> /dev/null 抑制螢幕輸出。這是唯一不需開啟 root shell 就能以管道方式寫入系統檔案的標準做法。

場景三:建立多重備份管道

mysqldump db_name | tee backup_$(date +%F).sql | gzip > backup_$(date +%F).sql.gz

同時產生未壓縮備份 (供快速檢視) 與壓縮備份 (供長期存儲)。

場景四:監控即時日誌並觸發告警

tail -f /var/log/nginx/access.log | tee -a /var/log/nginx/access_mirror.log | grep --line-buffered " 50[0-9] " | while read line; do
    alert_system "$line"
done

tee 建立日誌鏡像,grep 即時過濾 5xx 錯誤觸發告警,三者並行不悖。

常見誤區與注意事項

  • 緩衝區問題:管道預設為塊緩衝,即時性要求高的場景可使用 stdbuf -oL -eL 或 unbuffer 強制行緩衝。
  • 權限不足:tee 本身不提升權限,寫入受保護檔案需搭配 sudo。
  • 大檔案效能:tee 需同時寫入多個檔案描述符,超大資料流可能成為 I/O 瓶頸,考慮改用 split 或平行處理。

對比:tee vs 重導向 vs 複製

操作螢幕顯示存檔多檔同時寫入追加模式
cmd > file否是 (覆蓋)否>>
cmd | tee file是是 (覆蓋)是-a
cmd | tee -a file是是 (追加)是內建
cmd 2>&1 | tee file是是 (含錯誤)是-a

tee 是 Linux 管道哲學「做一件事並做好」的經典體現。熟練運用它能讓日常運維、腳本開發、除錯排查事半功倍。

Copyright © Windows教程網 All Rights Reserved