私はファイルシステムの変更を監視し、変更されたファイルに基づいてコマンドを実行するためにおよびを fswatch
使用しています。変更されたファイルを標準出力として印刷し、標準入力で使用します。xargs
fswatch
xargs <my command>
を使用すると、xargs -n1
すべての変更後にコマンドが実行されます。を使用すると、xargs -n100
100回の変更が発生するまで私のコマンドは実行されません。 1秒以内に発生するすべての変更(パラメータ)を一括処理したいと思います。
xargsがstdinから一度に50行を受信した場合、xargsに1回の呼び出しで50行すべてを私のコマンドに渡すようにしたいと思いますxargs -n1
。しかし、xargsが1分あたり1行だけを受け取る場合は、呼び出す前に50分を待ちたくありません。コマンドは比較的対話型であることを望みます(xargsがstdinからゼロ以外の引数を受け取る場合は最大1秒)。
よろしくお願いします!
ベストアンサー1
Bashにアクセスできる場合、および/または変数の-t
(タイムアウト)オプションを使用できます。read
SECONDS
少し見苦しいが、約1秒以内に発生する入力をグループ化できます。
#!/bin/bash
while true; do
values=()
start=$SECONDS
while [ "$SECONDS" -lt $((start + 1)) ]; do
if IFS= read -r -t 1 line; then
values+=("$line")
fi
done
if [ "${#values[@]}" != 0 ]; then
echo got "${values[@]}"
# do something useful with "${values[@]}" here
fi
done
タイムアウトは永久にブロックされるのを防ぎ、毎秒read
永久に入力を受ける病理的な場合でもSECONDS
内部ループが切れることをテストを通じて保証します。read