stdio(標準輸入輸出)
又稱:stdin · stdout · stderr · 標準輸入輸出
每個處理程序出生就有的三條預設資料管線:stdin 讀輸入、stdout 出正常輸出、stderr 出錯誤 —— 三條是分開的。
你會在什麼時候遇到它
「把檔案內容餵給程式」「把程式的輸出接住」「錯誤訊息怎麼不在 log 裡」—— 這些講的全是同一套機制。最經典的困惑:明明把輸出導向到檔案了,錯誤卻還是印在畫面上 —— 因為錯誤走的是 stderr,不是 stdout。MCP 服務跟宿主程式溝通時,也有一種模式直接拿 stdio 當傳輸通道。
打個比方
像銀行櫃檯:stdin 是你遞進去的單子,stdout 是行員印給你的收據,stderr 是另一套廣播,專門播「出了什麼問題」。三條通道互不干擾 —— 所以廣播再吵,收據還是乾淨的。
最小範例
# 一個指令,兩條輸出管線各走各的:
ls ~ /not-exist 1>out.txt 2>err.txt
cat out.txt # 只有成功列出的家目錄內容
cat err.txt # ls: /not-exist: No such file or directory1 是 stdout、2 是 stderr —— 這兩個編號是固定慣例。看懂它們是兩條管線之後,一整類謎題都有了解釋:為什麼導向輸出時錯誤還是打在畫面上、為什麼警告不會弄髒指令印出的 JSON(它走了 stderr)、以及 2>&1 是把兩條併成一條的寫法。
最常搞錯的地方
- 把 stderr 印出任何東西都當成「程式失敗了」。成敗要看結束代碼:很多工具在 stderr 印警告、工作照樣做完(結束代碼 0);反過來,滿滿一屏正常輸出也可能帶著非 0 的結束代碼。
- 以為管線會把一切送到下一個程式。管線 | 預設只搬 stdout;stderr 會繞過管線、直接印在你的終端機上 —— 「輸出少了一半」通常是那半走了錯誤通道。