科技 · 實用指南
curl 錯誤 23:重試傳輸前先診斷輸出消費者
錯誤 23 表示 curl 無法把已接收資料寫入本機目的地。保留 stderr 與管線各階段狀態,確認消費者是檔案、管線、終端或回呼,修復寫入端後再以完整位元組或可信雜湊驗收。

curl 結束碼 23 是本機寫入失敗,不是網路路徑診斷。先保存 curl stderr 與管線各階段狀態,再辨識真正的輸出消費者、重現其寫入契約、修復該消費者,並以完整位元組數或可信雜湊驗收。
1. 重試前保留第一次失敗
用不隱藏 stderr 的最小等價命令重現。直接寫檔時記錄命令、目的路徑、curl 結束碼與第一個寫入錯誤;管線結束後立刻保存 Bash PIPESTATUS,必要時啟用 pipefail。
不要先加重試、丟棄 stderr 或更改 TLS。錯誤 23 指向本機檔案系統或類似目的地的寫入失敗;重試不能建立缺少的目錄、釋放空間、重開已關閉管線或修正回呼回傳值。
2. 找出擁有失敗寫入的消費者
若 -o 指向檔案,檢查精確路徑的父目錄、權限、剩餘區塊與 inode、配額、掛載狀態與命名空間。stdout 進入管線時,下一個程序就是消費者;判斷它是按設計提早結束、崩潰或拒收資料。
寫入回呼必須回報實際處理的全部位元組。短回傳或失敗會以 CURLE_WRITE_ERROR 終止,因此要求位元組、回傳位元組與應用程式錯誤都要保留。
3. 重現本機目的地而非遠端請求
用無害的已知輸入單獨測試消費者。本機 curl 8.5.0 測試中,寫入 /dev/full、缺少父目錄、以及把完整串流送給 head -c 1 都讓 curl 回傳 23;完整串流送入 sha256sum 時兩端皆為零。
head 提早關閉在只需前綴時可能是刻意行為,但必須標成部分讀取。安裝包、封存檔與匯入資料要求完整內容,在消費者與完整性檢查通過前不可把警告隱藏成成功。
4. 修復責任端並定義驗收證據
修復已證實的分支:建立正確目錄與擁有者、釋放或擴充檔案系統、恢復可寫掛載、修正下游程式、避免前綴消費者,或讓回呼完整處理並準確回報所有位元組。
驗收不能只看訊息消失。要求 curl 與所有必要消費者回傳預期狀態,確認目的地在正確命名空間,並在可用時核對長度、發布者雜湊或簽章;把原始 stderr、狀態、目的身分與最終驗證一起保存。
