執行程式直到標準輸出返回特定數量的字節,然後終止

執行程式直到標準輸出返回特定數量的字節,然後終止

想像我有以下程式/腳本./generate-infinite-byte-stream

#!/bin/bash
echo -n 'hello'
sleep infinity

無限睡眠命令代表一個網路連接,該連接可能會也可能不會在無限期的未來傳送更多我不感興趣的資料。

我想要一個程序,我們稱其take 5為運行./generate-infinite-byte-stream直到在 stdout 上輸出 5 個位元組,然後終止它:

take 5 ./generate-infinite-byte-stream
# gives 'hello' and returns with exit code 0

是否有這樣的程式或我需要用 popen() 來推出自己的程式?該程式take還應該將標準輸入重定向到執行的程式。

注意:head -c 5沒有做正確的事情,因為它不會終止:

./generate-infinite-byte-stream | head -c 5
# this returns 'hello', but never terminates

旁白:Take 這個名字的靈感來自於https://reference.wolfram.com/language/ref/Take.html傳回清單的前 n 個元素的命令。

答案1

如果您的 shell 是 Bash,則可以使用進程替換。演示:

dd bs=1 count=5 < <(printf hello; sleep infinity)

這不會殺死生產者,但會斷開它的連接以便命令dd完成。這可能是也可能不是您所需要的。

相關內容