だからタイトルからわかるように、私はこれを見つけました。奇妙なsleep
デフォルトでは、increment
時間をパラメータとして提供します。例:
#!/usr/bin/env bash
set -x
SECONDS="1"
while true; do
echo "hello" || true
sleep "$SECONDS"
done
しかし、それは認めます。変数名を別々に指定するのではなく、その変数を使用したためです$SECONDS
。私が見ることができるように、変数がすることは時計の秒単位だけを出力するだけです。私が推測した日付に似ています。
しかし、実際にはどんな役割を果たしますか?私はBash文書や公開スクリプトでこれについて何も見たことがないと思います。
答え1
~からバッシュのマニュアルページ:
第二
このパラメーターが参照されるたびに、シェルが呼び出されてからの秒数が返されます。値がSECONDSに割り当てられている場合、後続の参照によって返される値は、割り当て後の秒数に割り当てられた値を加算した値です。 SECONDS が設定されていないと、後でリセットしても特殊属性が失われます。
したがって、設定を使用すると、 1から始まり、変数が経過時間に応じて増加SECONDS
する1
につれて、whileループが繰り返されるたびに2倍に増加するカウンタを再起動し、SECONDS
素晴らしいジオメトリシーケンスを提供しますsleep
。
+ SECONDS=1
+ true
+ echo hello
hello
+ sleep 1
+ true
+ echo hello
hello
+ sleep 2
+ true
+ echo hello
hello
+ sleep 4
+ true
+ echo hello
hello
...
答え2
SECONDSの一般的な用途は、長期実行ジョブのタイムアウトです。これは、反復操作に費やされた時間に起因するドリフトを防ぎ、ループ反復計算よりも正確です。
EXPIRED=$(( SECONDS + 5000 ))
while (( SECONDS < EXPIRED )); do
#.. some repeated task.
sleep 30
done
このようなタスクを実行する場合、スクリプトのどの場所でもSECONDSに割り当てることは安全ではありません。元の開始時間に基づいて他のすべての間隔を維持することをお勧めします。あるいは、最初にSECONDSを、現在の日の真夜中以降の秒数など、より便利な値に設定することもできます。これは、繰り返し操作を次のフルタイム単位で同期したい場合にも便利ですsleep $(( 60 - SECONDS % 60 ))
。
SECONDSを真夜中以降の秒数に初期化するために、次のものが見つかりました。
SECONDS=$(( $( date '+ 3600 * %H + 60 * %M + %S' ) ))
サブシェルは非常に特別です。親シェルのSECONDSをエクスポートすることから継承するため、これを変更できますが(たとえば、0にリセット)、親シェルはこれらの変更を見ることはできません。スタンドアロンシェルスクリプトはSECONDS = 0で始まります。
答え3
この場合$SECONDS
、
- 無効な変数名です。 Bash内蔵の「SECONDS」と混同されます。
- コマンドのパラメータです
sleep
。
このsleep
コマンドのデフォルト値は秒です。 thenSECONDS
値を割り当てて1
コマンドに渡すと、sleep
whileループ処理を1秒間一時停止し、条件が満たされるまでループなどを再処理します。
これをテストするには、端末を開いて入力してからをsleep 1
クリックしますENTER
。シェルは1秒間一時停止し、カーソルをユーザーに返します。