「一切皆字節流」是 Unix/Linux 的核心哲學。標準輸入、標準輸出、標準錯誤三大流、重定向、管道構成了 Shell 腳本與命令行組合操作的血管系統。本文深度剖析流模型、文件描述符、重定向語法、管道原理、實戰組合技。
| 名稱 | FD | 默認連接 | 用途 |
|---|---|---|---|
| 標準輸入 (stdin) | 0 | 鍵盤/終端 | 程序讀取數據來源 |
| 標準輸出 (stdout) | 1 | 屏幕/終端 | 程序正常結果輸出 |
| 標準錯誤 (stderr) | 2 | 屏幕/終端 | 診斷、警告、錯誤信息 |
進程啟動時內核自動打開 FD 0/1/2。Shell 通過 dup2() 系統調用重新綁定它們至文件/管道/設備。
cmd > file # 覆蓋寫入 stdout 到文件 (1> 同義)
cmd >> file # 追加寫入 stdout
cmd 2> file # 覆蓋寫入 stderr
cmd 2>> file # 追加寫入 stderr
cmd &> file # 同時重定向 stdout 和 stderr (覆蓋)
cmd &>> file # 同時追加 stdout 和 stderr
cmd > file 2>&1 # 經典寫法:stdout→file, stderr→stdout(即file) 【順序關鍵】
cmd > file 2>&1 等價於 cmd &> file
cmd < file # 從文件讀取 stdin
cmd << 'EOF' # Here Document:內嵌多行輸入,以 EOF 結束
cat << EOF > script.sh
#!/bin/bash
echo "Hello"
EOF
cmd <<< "string" # Here String:單字符串作為 stdin (Bash/Zsh)
exec 3> log.txt # 打開 FD 3 寫入文件
echo "debug" >&3 # 寫入 FD 3
exec 3>&- # 關閉 FD 3
exec 4< input.txt # 打開 FD 4 讀取
read line <&4
exec 4<&- # 關閉 FD 4
cmd1 | cmd2:內核創建管道 (管道 inode,無實體文件),將 cmd1 的 stdout (FD1) 連接管道寫端,cmd2 的 stdin (FD0) 連接管道讀端。cmd1 | cmd2 | cmd3 形成流水線,並發運行。|& (Bash/Zsh) = 2>&1 |:同時管道 stdout 和 stderr。| 命令 | 功能 | 典型管道用法 |
|---|---|---|
cat | 拼接/輸出文件內容 | cat file | grep pattern |
echo | 輸出字符串 | echo "path" | xargs rm |
wc | 統計行/詞/字節 (-l/-w/-c) | cat file | wc -l |
tee | 讀 stdin,同時寫 stdout 和文件 | cmd | tee log.txt | grep error |
tee -a 追加模式;tee - 輸出兩次到 stdout (調試用)。
# 1. 查找包含 error 的日志行數,並保存匹配行
grep "error" app.log | tee errors.txt | wc -l
# 2. 統計當前目錄下各類文件數量
find . -type f -name "*.*" | sed 's/.*\.//' | sort | uniq -c | sort -rn
# 3. 監控 nginx 訪問日志實時提取 4xx/5xx 狀態碼
tail -f /var/log/nginx/access.log | awk '$9 ~ /^[45]/ {print $0}'
# 4. 將命令結果既顯示又存檔,且捕獲 stderr
make 2>&1 | tee build.log
# 5. 使用進程替換 (Process Substitution) 實現多輸出
diff <(cmd1) <(cmd2) # 比較兩命令輸出,無需臨時文件
文本流機制賦予了 Linux 極強的組合性:標準流 (0/1/2) + 重定向 (><) + 管道 (|) + 文本工具 = 無限可能。熟練掌握 FD 操作、Here Doc、tee、進程替換,能讓 Shell 腳本從「能跑」進化為「健壯、高效、可維護」。

Linux 讓 rm 刪除的檔案進入垃圾桶:自訂 remove.sh 替換 rm 別名 + crontab 定期清理
Ubuntu 開機自動調整螢幕亮度:修改 GRUB 參數與 rc.local 設定預設值
ls -lih 解讀 Linux 檔案屬性完整指南:inode、類型、權限、連結數、擁有者、時間戳
Linux Git Bash 中文亂碼徹底解決方案:編碼、顯示與 Vim 一站式配置
Linux 安裝 Autossh 實現 SSH 連線自動重連與隧道持久化完整指南
Linux mount 報錯 "Structure needs cleaning" ?xfs_repair 修復全流程