標準出力が特定のバイト数を返すまでプログラムを実行してから終了します。

標準出力が特定のバイト数を返すまでプログラムを実行してから終了します。

次のプログラム/スクリプトがあると想像してください./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完了するように切断されます。これはあなたが必要とするかもしれないし、そうでないかもしれません。

関連情報