先日、macOS でシェルスクリプトを書いていたら、思わぬ落とし穴にハマりました。
「えっ、timeout コマンドがない…?」
Linux では当たり前に使える便利コマンドなのに、macOS では最初から入っていないんです。timeout は GNU coreutils の一部なので、Linux なら標準で使えるのですが、macOS に入っているのは BSD 系の coreutils。つまり timeout は存在しません。
とりあえず Homebrew で GNU coreutils を入れてみました:
brew install coreutils
すると確かに timeout …いや、正確には gtimeout が使えるようになります。そう、Homebrew は衝突を避けるためにすべてのコマンドに g を付けてインストールするんです。だから ls なら gls、cat なら gcat、そして timeout なら gtimeout。
これ、普段自分だけで使うなら別にいいんですけど、クロスプラットフォームのシェルスクリプトを書こうとすると一気に不便になります。macOS では gtimeout、Linux では timeout と書き分けないと動かない。もちろん Homebrew には g を取る方法もあるんですが、それをやるとシステムの ls や cat まで GNU 版に置き換わってしまって、ちょっと怖い。
そこで考えました。
「じゃあ、timeout だけ自分で作っちゃえばいいじゃん!」
というわけで、GNU 版と互換性をできるだけ保ちながら、シンプルに timeout だけを再実装しました。これなら余計なコマンドを上書きすることもなく、必要なものだけ導入できます。
リポジトリはこちらです:
👉 https://github.com/aisk/timeout
さらに Homebrew の tap も用意したので、インストールは超簡単:
brew install aisk/homebrew-tap/timeout
これで Linux と同じように timeout がそのまま使えるようになります。もう gtimeout に悩まされることもありません。
もともとは自分のために作ったツールなんですが、もし同じことで困っている人がいれば、ぜひ使ってみてください。そしてもし気に入ってもらえたら、GitHub でスターをポチっとしてもらえると泣いて喜びます(笑)。