シェルコマンドラインでほんの少しだけうるさい sleep が欲しかったりもして

お困り度は極めて低く…。

めっちゃ他愛もないニーズのために、少しだけ凝ったことをしようとして「期待通りのことが出来なかった」話、かな、要約すると。

とりあえず書いたスクリプト:

msg_after_sleep.py
 1 #! py -3
 2 # -*- coding: utf-8 -*-
 3 from __future__ import unicode_literals
 4 
 5 
 6 import sys
 7 import re
 8 import time
 9 
10 
11 if __name__ == '__main__':
12     import argparse
13     ap = argparse.ArgumentParser()
14     ap.add_argument(
15         "elapse", nargs="?",
16         default="1",
17         help="NUMBER[SUFFIX]: SUFFIX may be `s' for seconds (the default), \
18 `m' for minutes, `h' for hours or `d' for days.  Unlike most implementations \
19 that require NUMBER be an integer, here NUMBER may be an arbitrary floating \
20 point number.")
21     ap.add_argument(
22         "--message", default="Huh?")
23     args = ap.parse_args()
24     elapse = args.elapse.strip()
25     m = re.match(r"^([\d.eE+-]+)([mhd]){0,1}$", elapse)
26     if not m:
27         ap.error("invalid elapse")
28     v = float(m.group(1))
29     s = m.group(2)
30     elapse = (v * {"m": 60, "h": 60*60, "d": 60*60*24, None: 1}[s])
31     st = time.time()
32     try:
33         time.sleep(elapse)
34     except KeyboardInterrupt:
35         #print("^C")
36         pass
37     finally:
38         print("{:.3f} secs later: {}".format(time.time() - st, args.message))

shbangは適宜書き換えてちょ。

この「スバラシイスクリプト」がどの程度ステキじゃないかは動かせばわかる。そして「これよりもステキに」がどっちにしても大したもんではいないこともすぐにわかるだろう。

何がしたかったかというと、ワタシはコマンドラインでこんなことを良くやるのである:

1 [me@host: ~]$ # 別の bash セッションで、以下「hogemannder」コマンドが入力とする「viiideo.mkv」を
2 [me@host: ~]$ # 作っていて、あと2分くらいで出来そうだ、と見込みを立てている状態で...
3 [me@host: ~]$ sleep $((60*2)) ; hogemannder.exe viiideo.mkv -out=viiideo_converted.mp4

この際に、「2分かからなかった、じゃぁ hogemanだるか」とおもむろに Ctrl-c で「sleep を止める」。ここで「めっさ些細過ぎる問題」がある。sleep が Ctrl-c で止めても何か言うわけでなくて黙ったままなので、「ほんの僅かばかり不安」になったりするわけだ。

で、「ctrl-c したら確認を求めてくれるような sleep が欲しいよな」と思って「それが出来なかった」結果が msg_after_sleep.py。以前よりはマシにはなっているものの、昔から(Windows 版の?)Python で KeyboardInterrupt を扱うのは異様に難しいのよ、何してもうまくいかず、なので「せめて黙るな」にした結果。

Unix で試してないけど、たぶん Windows よりは簡単にやりたいことが出来るんではないかと想像する。ただ、この妥協案が「箸にも棒にも掛からぬ」のかといえば、まぁ人によっては少しうれしいのかもしれんよね、これ、要するに「キッチンタイマー」みたいなもんだから。少し頑張ってビープでも鳴らすように頑張れば、キッチンタイマーそのものになる。

どうでもいいがこんなん、組み込みで用意してあってほしかったような気がするよな。結構よくあるニーズだと思うのよね。