先日、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 でスターをポチっとしてもらえると泣いて喜びます(笑)。