私は永遠に実行され、他のものによって終了するまで定期的に出力するコマンドを持っており、tail -f
新しい出力があるたびに別のコマンドが実行されるようにしたいと思います。
指示:
- バッシュは利用できません
- このコマンドは明らかにそうではありません
tail
。ただ、次のコマンドを実行します。 - このコマンドの出力が常に 1 行ずつ表示されるわけではなく、各出力行に対して追加のコマンドを実行するつもりはありません。
- ポーリングは許容可能なソリューションではありません。
答え1
dd
以下は、改行で終了するかどうかにかかわらず、stdinから何かを読み取るたびに実行されるシェルコマンドの例です。
{
printf not-nl-terminated
sleep 1
printf '%s\n' nl-terminated
sleep 1
echo
sleep 1
printf 'binary\0data'
} |
while : ; do
input=$(dd bs=1M count=1 2>/dev/null | tr '\n\0' __)
[ "$input" ] || break
printf 'input of size %d\n' "${#input}"
done
減らす
input of size 17
input of size 14
input of size 1
input of size 11
このクリップのソースは基準使用時に理解するのに役立つ可能性のある動作を明示的に説明してくださいdd
。bs=
bs=
exprオペランドが指定されている場合sync
、またはそれ以外のnoerror
変換が要求されていない場合、notrunc
読み取りが返されると、各入力ブロックから返されたデータが別々の出力ブロックに書き込まれます。全ブロック未満変換が指定されていない場合、sync
結果の出力チャンクは入力チャンクと同じサイズでなければなりません。 exprオペランドが指定されていない場合、またはbs=
それ以外の変換が要求されている場合は、入力の終わりに達するまで入力を処理してフルサイズの出力ブロックとして収集する必要があります。sync
noerror
notrunc