想象一下我有以下程序/脚本./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
完成。这可能是也可能不是您所需要的。