🐚
Macのターミナルで標準出力に出力があったときに通知する方法
処理が終わるのに時間がかかるプログラムや、なにかを監視するプログラムを実行しているときに、標準出力(stdout)にログが出力されたときに通知バッジで知らせてほしい、というときは以下のコマンドで実現できます。
$ your_command | xargs -I{} echo 'echo {} & osascript -e '\''display notification '\"'{}'\"' with title '\"'From terminal'\"\' | sh
実行例
例えば、以下のようなスクリプトprint.py
に対して適用してみます。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import time
while(True):
print("Something happened!")
sys.stdout.flush()
time.sleep(2)
以下のように、標準出力にはそのままのログが出ます。
$ python print.py | xargs -I{} echo 'echo {} & osascript -e '\''display notification '\"'{}'\"' with title '\"'From terminal'\"\' | sh
Something happened!
Something happened!
Something happened!
Something happened!
Something happened!
そして通知センターには以下のように標準出力の内容のアラートが表示されます。
解説
通知センターにアラートを表示するには、AppleScriptを使います。osascript
コマンドによってAppleScriptをシェルから実行することができます。
標準出力を受け取って別のコマンドの引数にするにはxargs
コマンドを使います。-I
オプションによって、標準出力1行ずつ引数にして好きな位置に代入することができます。
パイプ演算子|
で受け取った標準出力をそのまま標準出力にも出しつつ、アラートに表示するテキストとしても使うには、echo
とosascript
両方実行する必要があるので、いったんコマンドをテキストとして整形し、最終的にそのテキストをsh
に渡して実行する形をとっています。
Discussion