長い処理が終了した時に成功/失敗を音で知らせてくれるコマンドをつくった

1 min read読了の目安(約1600字 2

きっかけ

テストコマンド・ビルドコマンドなど、長くかかるコマンドってありますよね??

僕はよく待ってる時間に他のことを始めて、
とっくに終わっていることにしばらく気づかないことがよくあります。

実行したコマンドが成功していればまだいいんですが、
失敗しているのに気づかず
「あーーー、再トライしなきゃいけなかったのに、時間無駄にしてしまった〜」
となることが非常に多いです。

なので、コマンドの終了ステータスが0かどうかをチェックして、
成功時には👍な音・失敗時には👎な音を鳴らすようにしてみました。

対象動作環境

  • macOS
  • zsh

実装

音を鳴らす

macOSには afplay というコマンドがデフォルトで入っているので、
成功時用の success.mp3 と 失敗時用の failure.mp3 を用意して、

success() {
  afplay /path/to/success.mp3
}

failure() {
  afplay /path/to/failure.mp3
}

と定義することで、まずは成功音を鳴らすコマンド・失敗音を鳴らすコマンドができました。

あるいは、macであればsay コマンドで読み上げができるので、

success() {
  say "success"
}

failure() {
  say "failure"
}

のような感じでもいいかもしれません。

直前のコマンドの終了コードに応じて、鳴らす音を変える

僕はあまりシェルに詳しくないのですが、どうやらこちらの記事によると、シェル変数$? には直前のコマンドの終了コードが入っているようです。

なので、

notify() {
  if [ "$?" = 0 ]; then
    success
  else
    failure
  fi
}

これで、鳴らしわけが出来ました。

使い方

あとは、

なんらかのコマンド; notify

と指定することで、そのコマンドが終わった時に、
お知らせしてくれるようになります🎉

発展

僕は頻繁に使うコマンドには短いエイリアスを積極的に貼っていきたい派なので、

alias -g N='; notify'

N という文字に通知を押し込めました。
これで、たとえばテスト待ちの場合であれば、

npm test N

あるいはビルド待ちであれば、

npm run build N

で手軽に通知を貼れるようになりました。

自分なりの主な使いみち

ちょうど最近githubの公式cliツールgh に github actionsの監視オプションができたので、

gh run watch N

と実行すると、

notify-demo

このように、インタラクティブにwatchしたいアクションが選べるので、
あとは放置しておけば、成功・失敗を音で知らせてくれて、
とても便利になりました!

まとめ

自分なりにテンションのあがる音を見つけていくのもまた一つの楽しみになりました🎙