想像我有以下程式/腳本./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
完成。這可能是也可能不是您所需要的。