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コマンドは指定した秒数のぴったり後に終了するわけではないよ」と主張した舌の根も乾かぬうちにこういうのを書くのもどうかと思いましたが、まあ、細かいことはいいんです。

youtu.be

なお、知ってる人は知ってると思いますが、このネタは一時期話題になったsleep sortのパクりです。

www.geeksforgeeks.org

まじめなことを書くと、これについてtwitterでつぶやいていたら以下のようなご意見をちょうだいしました。

  • 単に数値の足し算をするときではなく秒を示す"s"などのsuffixを付けて*1"sleep 4m 33s"と書くような場合に便利
  • 浮動小数点数の計算をsleep内でやってくれると便利かも(bashは整数演算しかできない)
  • "sleep <ベースの値> <乱数>"のようにスリープ時間にゆらぎを持たせたいときに便利そう
  • 複数の乱数を組み合わせて正規表現分布する時間スリープしたいことがあるかも

みなさんすごいですね。わたしは足し算しか思いつかなかったです。

*1:これもGNU拡張機能