🔖

時間制限を設けて毎秒処理を実行させるワンライナー【coreutils、timeout 使わない】

2021/12/25に公開

前提

coreutilstimeout を使うのであればこちらを参照してください。

今回が Mac に brew で何かを入れたくなかったので使わない方法を模索した結果になります。

やりたいこと

時間制限を設けて毎秒処理を実行させるワンライナーを書くこと。

もっと具体的には一定時間 「waiting...」 と毎秒 echo し続けて待たせること。

正直、「waiting...」と一回表示させるだけでもよかったのですが、コンソールが動いていないと長時間待たせるときに、ユーザーが不安になるのかなーと思った次第です。

結論

時間制限を設けて毎秒処理を実行させるワンライナー
for i in `seq 実行させたい時間(秒)`; do 実行させたいコマンド; sleep 1; done
サンプル
$ for i in `seq 5`; do echo waiting...; sleep 1; done
waiting...
waiting...
waiting...
waiting...
waiting...

参考

seq

for文の省略にはよく seq が用いられます。

【 seq 】コマンド――数字の列を出力する

seqの挙動
$ seq 5
1
2
3
4
5

応用版

実際使ってみたところ、1秒ごとに「waiting...」が表示されると、コンソールが忙しかったので、2秒ごとにしたくなりました。

一応、2秒だけではなく n秒 でも対応できるように修正して使いました。

結論(n秒ごとに実行する版)

for i in `seq 実行させたい時間(秒)`; do if [ $i%n秒 -eq 0 ]; then 処理; else; fi; sleep 1; done
サンプル
$ for i in `seq 5`; do if [[ $i%2 -eq 0 ]]; then echo waiting...; else; fi; sleep 1; done
waiting...
waiting...

応用版の解説

ただif文のワンライナーと組み合わせただけです。

if文ワンライナー
if [ 条件式 ]; then 処理; else 処理; fi

以下は $i が 2 で割って割り切れた時のみ echo するワンライナーの例です。

サンプル
if [[ $i%2 -eq 0 ]]; then echo waiting...; else; fi
GitHubで編集を提案

Discussion