Skip to content

Latest commit

 

History

History
84 lines (59 loc) · 2.43 KB

b2c73393159eec19beda.md

File metadata and controls

84 lines (59 loc) · 2.43 KB
title emoji type topics published
時間制限を設けて毎秒処理を実行させるワンライナー【coreutils、timeout 使わない】
🔖
tech
ShellScript
Bash
shell
coreutils
timeout
true

前提

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 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 [ 条件式 ]; then 処理; else 処理; fi

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

if [[ $i%2 -eq 0 ]]; then echo waiting...; else; fi