次のようなプログラム/スクリプトがあるとします./generate-infinite-byte-stream
。
#!/bin/bash
echo -n 'hello'
sleep infinity
無限スリープ コマンドは、将来的に関心のないデータを配信するかどうかわからないネットワーク接続を表します。
stdout に 5 バイトを出力するまでtake 5
実行し、その後終了するプログラムを作成したいと思います。./generate-infinite-byte-stream
take 5 ./generate-infinite-byte-stream
# gives 'hello' and returns with exit code 0
そのようなプログラムはありますか、それとも popen() を使って独自に作成する必要がありますか? プログラムは、take
実行されたプログラムに stdin もリダイレクトする必要があります。
注:head -c 5
終了しないので、正しい動作は行われません。
./generate-infinite-byte-stream | head -c 5
# this returns 'hello', but never terminates
余談:テイクという名前は、https://reference.wolfram.com/language/ref/Take.htmlリストの最初の n 要素を返すコマンド。
答え1
シェルが Bash の場合は、プロセス置換を使用できます。デモ:
dd bs=1 count=5 < <(printf hello; sleep infinity)
これはプロデューサーを強制終了するわけではありませんが、コマンドが完了するようにプロデューサーを切断しますdd
。これは必要なことかもしれませんし、そうでないかもしれません。