次のプログラム/スクリプトがあると想像してください./generate-infinite-byte-stream
。
#!/bin/bash
echo -n 'hello'
sleep infinity
無限スリープコマンドは、私が興味を持っていない無限の将来にもっと多くのデータを渡すこともそうでないかもしれないネットワーク接続を表します。
take 5
私はstdoutから5バイトを出力するまで実行され、./generate-infinite-byte-stream
終了するプログラムが欲しいです。
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/言語/ref/Take.htmlリストの最初のn個の要素を返すコマンド。
答え1
シェルがBashの場合は、プロセス置換を使用できます。デモ:
dd bs=1 count=5 < <(printf hello; sleep infinity)
これにより、プロデューサは終了しませんが、コマンドがdd
完了するように切断されます。これはあなたが必要とするかもしれないし、そうでないかもしれません。