Shell

在管道傳輸到另一個命令之前完全緩衝命令輸出?

  • March 10, 2021

有沒有辦法只在沒有臨時文件的情況下執行另一個命令?我有一個執行時間較長的命令和另一個命令格式化輸出並使用 curl 將其發送到 HTTP 伺服器。如果我只是執行commandA | commandBcommandB將啟動curl,連接到伺服器並開始發送數據。因為commandA需要很長時間,HTTP 伺服器會超時。我可以做我想做的事commandA > /tmp/file && commandB </tmp/file && rm -f /tmp/file

出於好奇,我想知道是否有沒有臨時文件的方法。我試過mbuffer -m 20M -q -P 100了,但是 curl 過程仍然從一開始就開始了。Mbuffer 一直等到commandA實際發送數據完成。(數據本身最大隻有幾百 kb)

這類似於其他幾個答案。如果你有“moreutils”包,你應該有這個sponge命令。嘗試

commandA | sponge | { IFS= read -r x; { printf "%s\n" "$x"; cat; } | commandB; }

sponge命令基本上是一個直通過濾器(如cat),只是它在讀取整個輸入之前不會開始寫入輸出。即,它“吸收”數據,然後在您擠壓它時釋放它(就像海綿一樣)。所以,在一定程度上,這就是“作弊”——如果有大量數據,sponge幾乎肯定會使用臨時文件。但它對你來說是不可見的;您不必擔心諸如選擇唯一文件名和事後清理之類的日常事務。

{ IFS= read -r x; { printf "%s\n" "$x"; cat; } | commandB; } 讀取輸出的第一行sponge。請記住,這在完成之前不會出現commandA。  然後它啟動commandB,將第一行寫入管道,並呼叫cat以讀取其餘輸出並將其寫入管道。

引用自:https://unix.stackexchange.com/questions/188175