Ubuntuでは、スクリプトに最小x秒かかることを確認する簡単なコードがあります(ここでは500)。
t1=$(date +%s)
# script is here
t2=$(date +%s)
let "t = 500 - $t2 + $t1"
(( t = t>0 ? t : 1 ))
sleep $t
コードは完全に動作しますが、私のコーディングは効率的ではないと思います。これらの3行は
t2=$(date +%s)
let "t = 500 - $t2 + $t1"
(( t = t>0 ? t : 1 ))
1行で表現する必要があります。私の質問はコードを改善する方法です。
答え1
あなたのスクリプトは移植が不可能で(およびをlet
使用しているので(( .. ))
)混乱しています(両方 let
と(( .. ))
)、文書が不足し(コメントなし、変数名は説明的ではない)、やや安全ではありません(引用符付きの拡張子がないため$t
)。
書き直したいなら、これは私のものです。
#!/bin/sh
min_duration=500
t_start=$(date +%s)
# script is here
t_end=$(date +%s)
elapsed=$(( t_end - t_start ))
# sleep long enough to make sure 'min_duration' seconds has elapsed,
# but at least 1 second
sleep "$(( elapsed < min_duration ? min_duration - elapsed : 1 ))"
答え2
bash
特別なパラメータを使用してこれを行うには、次のようにしますSECONDS
。
#!/bin/bash
SECONDS=0
# script is here
sleep "$(( 500 > SECONDS ? 500 - SECONDS : 1 ))"
通常、SECONDS
スクリプトが開始されてからの時間を秒単位で返しますが、タイマーを(再)設定するために任意の値を割り当てることができます。
答え3
簡単な代替方法は、バックグラウンドでスリープモードを実行し、wait
別のコードを実行してからスリープモードを実行することです。
#!/bin/bash
sleep 500 &
# script is here
wait