次のことを行うことで、bashでtrueになる条件を待つことができます。
while true; do
test_condition && break
sleep 1
done
ただし、反復(スリープ)ごとに1つのサブプロセスを作成します。私はそれらを避けることができます:
while true; do
test_condition && break
done
ただし、多くのCPUを使用します(ビジー待機)。サブプロセスと忙しい待機を避けるために、私は以下の解決策を思いつきましたが、それはいです:
my_tmp_dir=$(mktemp -d --tmpdir=/tmp) # Create a unique tmp dir for the fifo.
mkfifo $my_tmp_dir/fifo # Create an empty fifo for sleep by read.
exec 3<> $my_tmp_dir/fifo # Open the fifo for reading and writing.
while true; do
test_condition && break
read -t 1 -u 3 var # Same as sleep 1, but without sub-process.
done
exec 3<&- # Closing the fifo.
rm $my_tmp_dir/fifo; rmdir $my_tmp_dir # Cleanup, could be done in a trap.
注:一般的な場合、read -t 1 var
fifoなしでは単純に使用できません。これはstdinを消費し、stdinが端末またはパイプでない場合は機能しないためです。
サブプロセスや忙しい待機をよりエレガントな方法で回避できますか?
true
、質問が更新されました。
read -t 1 var
。
sleep
、最初の例のように進めることを強くお勧めします。2つ目は、動作する可能性はありますが、将来調整するのは簡単ではありません。単純なコードは、安全である可能性も大きくなります。
true
は組み込みであり、bashでサブプロセスを作成しません。忙しい待機は常に悪いでしょう。