引数を受け取るたびに `xargs`を実行するようにしてください。すべての「-n」パラメータの代わりに?

引数を受け取るたびに `xargs`を実行するようにしてください。すべての「-n」パラメータの代わりに?

私はファイルシステムの変更を監視し、変更されたファイルに基づいてコマンドを実行するためにおよびを fswatch使用しています。変更されたファイルを標準出力として印刷し、標準入力で使用します。xargsfswatchxargs <my command>

を使用すると、xargs -n1すべての変更後にコマンドが実行されます。を使用すると、xargs -n100100回の変更が発生するまで私のコマンドは実行されません。 1秒以内に発生するすべての変更(パラメータ)を一括処理したいと思います。

xargsがstdinから一度に50行を受信した場合、xargsに1回の呼び出しで50行すべてを私のコマンドに渡すようにしたいと思いますxargs -n1。しかし、xargsが1分あたり1行だけを受け取る場合は、呼び出す前に50分を待ちたくありません。コマンドは比較的対話型であることを望みます(xargsがstdinからゼロ以外の引数を受け取る場合は最大1秒)。

よろしくお願いします!

ベストアンサー1

Bashにアクセスできる場合、および/または変数の-t(タイムアウト)オプションを使用できます。readSECONDS

少し見苦しいが、約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

おすすめ記事