元のコードに少し近づけるために、私がやることは:
while true; do
sleep 1 &
...your stuff here...
wait # for sleep
done
これにより、セマンティクスが少し変更されます。1秒もかからなかった場合は、1秒が経過するのを待つだけです。ただし、なんらかの理由で1秒よりも時間がかかる場合、終わりのないサブプロセスがさらに生成され続けることはありません。
したがって、バックグラウンドではなく並行して実行されることはないため、変数も期待どおりに機能します。
追加のバックグラウンドタスクも開始する場合wait
は、sleep
特にプロセスを待機するように命令を変更する必要があることに注意してください。
さらに正確にする必要がある場合は、システムクロックに同期して、1秒ではなくmsスリープする必要があります。
システムクロックに同期する方法 まったくわからない、愚かな試み:
デフォルト:
while sleep 1
do
date +%N
done
出力:003511461 010510925 016081282 021643477 028504349 03 ...(キープ成長)
同期済み:
while sleep 0.$((1999999999 - 1$(date +%N)))
do
date +%N
done
出力:002648691 001098397 002514348 001293023 001679137 00 ...(同じまま)