I/O 重定向是 Shell 腳本與系統管理的核心技能。本文深入解析文件描述符機制、標準流重定向語法、自定義描述符操作與實戰模式。
| FD | 名稱 | 預設設備 |
|---|---|---|
| 0 | stdin (標準輸入) | 鍵盤 |
| 1 | stdout (標準輸出) | 螢幕 |
| 2 | stderr (標準錯誤) | 螢幕 |
| 3-9 | 保留/自定義 | 臨時連接 |
| 語法 | 效果 | 範例 |
|---|---|---|
cmd > file | stdout 覆蓋寫入 file | ls /dev > list.txt |
cmd 1> file | 同上 (1 可省略) | ls /dev 1> list.txt |
cmd >> file | stdout 追加寫入 | ls /dev >> list.txt |
cmd 2> file | stderr 覆蓋寫入 | ls -qw /dev 2> err.txt |
cmd &> file | stdout + stderr 合併寫入 | ls /dev &> all.txt |
cmd < file | stdin 從 file 讀取 | grep keyword < file |
i>&j)exec 5>&1 # FD5 指向 stdout (備份 stdout)
exec 3<> filename # 開啟檔案指派給 FD3 (讀寫)
read -n 4 <&3 # 從 FD3 讀 4 字元
echo -n . >&3 # 在第 5 字元位置寫入 '.' 覆蓋
exec 3>&- # 關閉 FD3
執行後 cat filename 顯示原內容第 5 字元被替換為 .。
| 語法 | 效果 |
|---|---|
n<&- | 關閉輸入 FD n |
0<&- / <&- | 關閉 stdin |
n>&- | 關閉輸出 FD n |
1>&- / &>- | 關閉 stdout |
> filename
: > filename # 更通用,所有 shell 相容
exec 6>&1 # 備份 stdout 到 FD6
exec > /tmp/log # 重導向 stdout 到日誌
# ... 執行命令 ...
exec 1>&6 # 恢復 stdout
exec 6>&- # 關閉備份 FD
cmd > out.log 2> err.log
cmd 2> err.log | process_stdout
exec 2> /var/log/script.err 統一捕獲錯誤{ ... } 3> file 代碼塊級重定向 (Bash 4.1+)tee 同時輸出螢幕與檔案:cmd | tee log.txt熟練掌握 FD 操作,腳本將具備企業級健壯度與除錯能力。