マイコンピュータで1つの簡単なコマンドを繰り返すループを実行する必要があります。
私が必要だとしましょう:
- この場合、次の簡単な方法で生成された列挙型(file-0、file-1、file-2、...)を増やしてファイルを保存します。
time > file-$x
- 私の時間を1秒の一部として表現したいので(たとえば)1/70秒ごとにこれを行う必要があります。
どうすればbashスクリプトですべてを正確に表現して表現できますか?
分数は不確実な数量を生成し、正確でなければならないため、小数点以下4〜5桁以上が必要です。
答え1
Bashで小数を小数に変換するには:
myvar=$(echo "scale=4; 5/10" | bc)
その後、値を繰り返すには
for i in $(seq 1 1000); do sleep $myvar; done
Debian(GNU)の睡眠実装は、10進数の睡眠値を受け入れるようです。
残念ながら..
この種の精度(小数点4〜5桁)を使用するには、Perlスクリプトやコンパイルされたプログラムなどが必要です。ループ内でプログラムを呼び出すことによるオーバーヘッドは、多くのジッタを追加します。スリープ呼び出し自体には数ミリ秒かかります。
1/10,000秒の睡眠を1000回行い、シナリオを考えてみましょう。
time for i in $(seq 1 1000); do sleep 0.0001; done
real 0m2.099s
user 0m3.080s
sys 0m1.464s
予想される結果は1/10秒です。睡眠はあなたが参照したいレベルに近いではありません。
https://stackoverflow.com/questions/896904/how-do-i-sleep-for-a-millisecond-in-perl
PerlのTime::HiRes、1000*1000マイクロ秒使用:
my $i=0;
for($i=0;$i<=1000;$i++) {
usleep(1000);
}
real 0m1.133s
user 0m0.024s
sys 0m0.012s
しばらく近づいてみましょう。
答え2
たぶんあなたは単に実行することができます
sleep 0.7
?
man 1 sleep
私のarchlinux
ディストリビューションから:
説明NUMBER秒間一時停止します。サフィックスは、秒(デフォルト)の場合は「s」、分の場合は「m」、時間の場合は「h」、日の場合は「d」です。 NUMBERが整数でなければならないほとんどの実装とは異なり、NUMBERは浮動小数点数にすることができます。複数の引数が与えられると、その値の合計で指定された時間だけ一時停止します。
答え3
プロセスを作成して新しい実行可能ファイルをロードするのに数ミリ秒かかることがあるため、この精度は実際には意味がありません。さらに、多くのシステムでは、CPU時間は最大10ミリ秒単位でプロセスに割り当てられます。
ただし、一部のsleep
実装では分数秒が必要で、zshとksh93の両方が$SECONDS
特殊変数を使用して分数秒にすることができますtypeset -F SECONDS
。
はい(zsh):
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((1./70)); date +%s.%N; done | { head -n3;echo ..;tail -n3; }; echo $SECONDS
1350076317.374870501
1350076317.391034397
1350076317.407278461
..
1350076318.464585550
1350076318.480887660
1350076318.497133050
1.1393780000
こんな、消えた。以下に基づいて睡眠時間を調整できます$SECONDS
。
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do sleep $((i/70. - SECONDS)); date +%s.%N; done | { head -n3;echo ...;tail -n3; }; echo $SECONDS
1350076420.262775654
1350076420.277012997
1350076420.291302750
../..
1350076421.219682227
1350076421.234134663
1350076421.248255685
1.0020580000
sleep
最後のANDコマンドを実行すると、追加の2ミリ秒がdate
発生する可能性があります。
また、zshにはzselect
100分の1秒で表示されるタイムアウト機能が組み込まれています。 ksh93にはsleep
組み込み機能があり、浮動小数点を受け入れ、printf
日付/時刻を印刷できます。
$ typeset -F SECONDS=0; for ((i=1; i<=70; i++)); do ((i<4 || i>67)) && printf '%(%S.%N)T\n' now; sleep $((i/70.-SECONDS)); done; echo $SECONDS
20.823349000
20.837510000
20.851663000
21.780099000
21.794254000
21.808405000
0.9992358685
より正確なものが必要な場合は、リアルタイムOSまたはリアルタイム機能を備えたOSが必要な場合があります。そして確かにいいえシェルを使用してください。
答え4
下にアルパインLinux(Busybox)マイクロ秒(1秒usleep 10
に相当)の間繰り返すことができます。0.00001
GNU sleep
秒単位までサポートされます。sleep 0.00001