[Mac] 時間がかかる処理をターミナルで実行すると、終わったタイミングで画面に通知する自作コマンド
きっかけ
Rails で $ bin/rake でテストをすべて走らせると時間がかかるのですが、終わったタイミングで画面に通知してほしいな~とふと思ったので自作コマンドを作りました。
通知/ダイアログの出し方
Macでターミナルから画面に通知を出すやり方を調べたらosascriptコマンドでできました。
参考
- https://qiita.com/uqichi/items/180d9a5ad661268e0007
- https://qiita.com/soh19/items/200f5881ed1fc87665dd
通知
$ osascript -e 'display notification "てすと" with title "テスト"'

ダイアログ
$ osascript -e 'display dialog "てす と" buttons {"OK"} with title "テスト"'

コマンドの終了タイミングでの通知コマンドの実行方法
$ command1 && command2 と書くと command1 が正常終了した場合にのみ command2 を実行、
$ command1 || command2 と書くと command1 が異常終了した場合にのみ command2 が実行されます。
いままで書いたことなかったのですが、&&と||を一緒に使うと正常終了と異常終了でコマンドを分けれます。
$ ls && echo OK || echo NG
OK
$ sl && echo OK || echo NG
NG
上記を使って、$ bin/rake が正常終了(例:テストがすべて通った)なら画面に通知を表示(自動で消えても問題ない)して、異常終了(例:テストがこけた)なら画面にダイアログを表示(OKボタンを押さない限り残り続ける)するコマンドを作ろうと思います。
できたもの
okコマンド
#!/bin/sh
if [ $# -ne 0 ]; then
command="\`$@\`"
else
command='The task'
fi
# echo $command
osascript -e "display notification \"$command was successfully done.\" with title \"OK\""
使い方
$ docker compose exec rails 'bin/rake' && ok
ngコマンド
#!/bin/sh
if [ $# -ne 0 ]; then
command="\`$@\`"
else
command='The task'
fi
# echo $command
osascript -e "display dialog \"$command was failed.\" buttons {\"OK\"} with icon 2 with title \"NG\"" >/dev/null
使い方
$ docker compose exec rails 'bin/rake' || ng
subscribeコマンド
上記okコマンドができただけでだいぶ満足したのですが、ngと組み合わせてコマンドが正常終了しても異常終了しても通知するsubscribeコマンドを作りました。
(もっと短い単語がよかったですが思いつかず、コマンドを購読して通知するイメージなのでsubscribeとしました。)
#!/bin/sh
$@ && (ok $@) || (ng $@)
使い方
$ subscribe docker compose exec rails 'bin/rake'
テスト目的で作りましたが、$ npm installや$ brew upgradeなど時間がかかるコマンド一般で頭にsubscribeをつけるだけで通知してくれるので簡単にできた割には重宝しそうだなと思いました。
$ subscribe npm i
$ subscribe brew upgrade

これで、重い処理は裏で走らせて、終わりを見計らってチラチラ確認することなく作業に集中できそうです。
Windows/WSL 版も作成しました。(2025/8/24 追記)
WSL でのやり方を以下に書きました。
Discussion