sleepコマンドの足し算機能
GNU coreutilsに入っているsleepコマンドにはマニアックな機能がいくつかあって、そのうちの一つが「引数を2つ以上指定できて、それらの引数をすべて足した秒数だけ待つ」という謎機能です。以下Ubuntu 18.04のman sleepより抜粋
SLEEP(1) User Commands SLEEP(1) NAME sleep - delay for a specified amount of time SYNOPSIS sleep NUMBER[SUFFIX]... sleep OPTION DESCRIPTION Pause for NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. Unlike most implementations that require NUMBER be an integer, here NUMBER may be an arbitrary floating point number. Given two or more argu‐ ments, pause for the amount of time specified by the sum of their values.
何に使うのかよくわかりませんでしたが、足し算に使えるそうなことがわかりましたので、やりかたを書いておきます。たとえば「1+5+2の答えは一体なんだったっけ…まったく思い出せない」という場合に以下のコマンドを使えばたちどころに答えが得られるというわけです。
$ time sleep 1 5 2 real 0m8.002s # 答えは8! user 0m0.001s sys 0m0.000s
仕組みは簡単で、引数を足した値sleepしてくれるということは、timeコマンドを使ってsleepを実行すると、実行にかかった経過時間(real)は引数の値をすべて足したものに若干のオーバーヘッドを加えたものになるだろう、という話です。
本日公開した動画で「sleepコマンドは指定した秒数のぴったり後に終了するわけではないよ」と主張した舌の根も乾かぬうちにこういうのを書くのもどうかと思いましたが、まあ、細かいことはいいんです。
なお、知ってる人は知ってると思いますが、このネタは一時期話題になったsleep sortのパクりです。
まじめなことを書くと、これについてtwitterでつぶやいていたら以下のようなご意見をちょうだいしました。
- 単に数値の足し算をするときではなく秒を示す"s"などのsuffixを付けて*1"sleep 4m 33s"と書くような場合に便利
- 浮動小数点数の計算をsleep内でやってくれると便利かも(bashは整数演算しかできない)
- "sleep <ベースの値> <乱数>"のようにスリープ時間にゆらぎを持たせたいときに便利そう
- 複数の乱数を組み合わせて正規表現分布する時間スリープしたいことがあるかも
みなさんすごいですね。わたしは足し算しか思いつかなかったです。