シェルコマンド出力でコマンドを実行する

シェルコマンド出力でコマンドを実行する

私は永遠に実行され、他のものによって終了するまで定期的に出力するコマンドを持っており、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

このクリップのソースは基準使用時に理解するのに役立つ可能性のある動作を明示的に説明してくださいddbs=

bs=exprオペランドが指定されている場合sync、またはそれ以外のnoerror変換が要求されていない場合、notrunc 読み取りが返されると、各入力ブロックから返されたデータが別々の出力ブロックに書き込まれます。全ブロック未満変換が指定されていない場合、sync結果の出力チャンクは入力チャンクと同じサイズでなければなりません。 exprオペランドが指定されていない場合、またはbs= それ以外の変換が要求されている場合は、入力の終わりに達するまで入力を処理してフルサイズの出力ブロックとして収集する必要があります。syncnoerrornotrunc

関連情報