🐚

Macのターミナルで標準出力に出力があったときに通知する方法

2022/03/21に公開

処理が終わるのに時間がかかるプログラムや、なにかを監視するプログラムを実行しているときに、標準出力(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行ずつ引数にして好きな位置に代入することができます。

パイプ演算子|で受け取った標準出力をそのまま標準出力にも出しつつ、アラートに表示するテキストとしても使うには、echoosascript両方実行する必要があるので、いったんコマンドをテキストとして整形し、最終的にそのテキストをshに渡して実行する形をとっています。

参考

Discussion