⏳
[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
コマンド
~/.local/bin/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
コマンド
~/.local/bin/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としました。)
~/.local/bin/subscribe
#!/bin/sh
$@ && (ok $@) || (ng $@)
使い方
$ subscribe docker compose exec rails 'bin/rake'
テスト目的で作りましたが、$ npm install
や$ brew upgrade
など時間がかかるコマンド一般で頭にsubscribe
をつけるだけで通知してくれるので簡単にできた割には重宝しそうだなと思いました。
$ subscribe npm i
$ subscribe brew upgrade
これで、重い処理は裏で走らせて、終わりを見計らってチラチラ確認することなく作業に集中できそうです。
Discussion