AppleScriptまたはシェルスクリプトから通知センター通知をトリガーするにはどうすればよいですか?


305

私が書いたAppleScriptとシェルスクリプトの10.8の通知センター機能を利用できるようになりたいです。

AppleScriptまたはシェルスクリプトのいずれかから使用できる組み込みコマンドまたはサードパーティライブラリはありますか?

理想的には、通知の種類とアイコンを制御できますが、ストックアイコン(ただしカスタムテキスト)を使用して基本的なバナーをトリガーする機能さえあれば十分です。


回答:


428

Mavericks以降では、AppleScriptの「表示通知」を使用してこれを行うことができます。

display notification "Lorem ipsum dolor sit amet" with title "Title"

                          

それだけです。文字通りシンプルです!いいえ3 番目のパーティのライブラリやアプリケーションは必要ありませんし、他のシステムで使用するために完全に移植です。上部に10.9通知、中央に10.10 DP、下部に10.10通知。

AppleScriptは、/ usr / bin / osascriptを使用してシェルから実行できます。

osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'

追加してアラートをさらにカスタマイズすることもできます…

  • 字幕

    'subtitle'の後に、サブタイトルを含む文字列または変数を追加します。

    display notification "message" with title "title" subtitle "subtitle"

    上記の例では、次の通知が生成されます。

  • 「サウンド名」の後に、通知とともに再生されるサウンドの名前を追加します。

    display notification "message" sound name "Sound Name"

    有効なサウンド名は…にあるサウンドの名前です

    • ~/Library/Sounds
    • /System/Library/Sounds

投稿通知は、コマンドラインスクリプトとしてラップできます。次のコードはターミナルで実行でき、/ usr / local / binにスクリプトを追加します(存在する必要があり、$ PATHに追加しnotifyます)。

cd /usr/local/bin && echo -e "#!/bin/bash\n/usr/bin/osascript -e \"display notification \\\"\$*\\\"\"" > notify && chmod +x notify;cd -

これは、上記が通知のために追加するスクリプトです。

#!/bin/bash
/usr/bin/osascript -e "display notification \"$*\""

通知を表示するには:

notify Lorem ipsum dolor sit amet
sleep 5; notify Slow command finished

9
@ceilingcatこれはAppleScriptです。ターミナルで実行するには、osascriptを使用します(回答を参照)。
GRGの

8
唯一の問題display notificationは、クリックするとファイルを開くダイアログが表示されることです。
ɹoƃı

7
ユーザーが明示的にクリックするまで、通知ポップアップを永久に存在させることは可能ですか?
Sridhar Ratnakumar

25
ご列席の皆様、World Wide Webでの1時間の調査の後、ユーザーによって却下されるまで通知ウィンドウを保持する方法を見つけました。実際には、記述されたスクリプトの一部のパラメーターではなく、システム設定の設定によって制御されていました。これらの2つの画像はすべて説明する必要がありますi.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg 楽しんでください。
ヴィックジャン

4
テキストは二重引用符で囲む必要があることに注意してください。単一引用符は機能しません。したがって、テキストに変数が必要な場合、を書くことはできませんが"display ... '$mytext' ..."、エスケープされた二重引用符が必要です "display notification \"$mytext\" ..."
mivk

93

端末通知者

READMEから:

terminal-notifierは、Mac OS X 10.8で利用可能なMac OS Xユーザー通知を送信するコマンドラインツールです。

NSUserNotification「Foundationツール」では機能しないため、現在アプリケーションバンドルとしてパッケージ化されています 。レーダー:// 11956694

このツールは、ファイルシステムの変更により実行されるコマンドのステータスを表示するために、Kickerによって使用されます。(v3.0.0)

ダウンロード

コード署名済みですぐに使用できるビルド済みのバイナリは、ダウンロードセクションから入手できます。

使用法

$ ./terminal-notifier.app/Contents/MacOS/terminal-notifier group-ID sender-name message [bundle-ID]

terminal-notifierを使用するには、アプリバンドルのバイナリを呼び出す必要があります 。

最初の引数は、通知が属する「グループ」を指定します。「グループ」については、以前に投稿された通知を置き換えて、1つの通知のみが表示されます。例:一意のプロセスによって通知をスコープする送信者のプロセスID、またはプロジェクトによる通知をスコープする現在の作業ディレクトリ。

2番目と3番目の引数は通知自体を説明し、それぞれ「タイトル」と「メッセージ」です。たとえば、通知の送信者をユーザーに通知するには、送信者の名前をタイトルとして指定できます。

4番目と最後の引数はオプションです。ユーザーが通知をクリックしたときにアクティブにするアプリケーションを指定します。デフォルトでは、これはTerminal.appをアクティブにし、代わりにアプリケーションのバンドル識別子を指定して別のアプリケーションを起動します。たとえば、Safari.appを起動するには次を使用しますcom.apple.Safari


甘い、素晴らしいライブラリ!アイコンとアラート対バナーの制御で更新されるのを楽しみにしていますが、間違いなく便利です。リンクをありがとう!i.imgur.com/tsCeK.png
ネイサングリーンスタイン

2
素晴らしい小さなアプリです。ランチャーを作成し、/ usr / local / binに入れて、ターミナルなどからどこでも使用できるようにします。ランチャースクリプト:#!/ bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./terminal-notifier $ *
johanandren

4
ランチャーは便利です。少し変更すると、スペース付きの引用テキストで機能します:#!/ bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard

27

多くの人がボタンをクリックすることでのみ却下できる通知ポップアップを望んでいることを知っているので、@ grgarsideの回答にメモを追加したいだけです。

比較

私はあなたのための解決策を見つけました:

実際には、記述されたスクリプトのパラメーターではなく、システム設定の設定によって制御されていました。これらの2つの画像はそれをすべて説明する必要があります

すばらしい回答をありがとう@grgarside。

システム設定


5
特定のアプリは異なることに注意してください。Script EditorだけのためであるScript Editor.apposascript。サービスワークフローでは、Automator Runnerです。ときに内部のAutomator.app、それはですAutomator
CDE

1
バナーをクリックすると、スクリプトエディターアプリケーションが表示されるのは面倒です。それはクリックするだけで消えるために私が欲しいが、このポストは指摘あなたはそれの上に置いて、それが静かに離れて行くようにするトラックパッド、スワイプ右することができます:osxdaily.com/2012/09/05/...
ジョシュア・ゴールドバーグ

@JoshuaGoldbergそれを追加してくれてありがとう!Mac OS Xの好きなことの1つである直感的に、ある日、それが期待どおりに機能することを発見しました:)
ヴィックジャン

22

これをGrowl2(App Storeから入手可能)で行うことができます。Growlをインストールし、「OS X通知」を有効にします(スクリーンショット)

ここに画像の説明を入力してください

さらに、コマンドラインツール用にGrowlNotifyをインストールして、Growl通知を送信する必要があります。このツールは、ダウンロードページから無料でダウンロードできます

これで、コマンドラインからGrowl通知を生成でき、通知センターに転送されます。例えば:

growlnotify -n "My App" -m "Hello world"

ここに画像の説明を入力してください

現在、アプリケーションアイコンを変更することはできないようです。


1
特にgrowlがすでにインストールされている場合は、素晴らしい方法です。
ベシ

1
--icon path/to/icon.pngアイコンのオプションを使用できる可能性があると思います。
ウィル14

非推奨/メンテナンスされなくなった?最終更新はmacos 10.9 mavericks
Seamus

15

私は最近、ターミナルノーティファイアを分岐して、通知アラート(アクション付き)と返信タイプアラートを表示するコマンドラインツールを構築しました。

シェルスクリプトとgolangアプリで使用して、ユーザーからインタラクティブな回答を得ます。

https://github.com/vjeantet/alerter

ここに画像の説明を入力してください


1
また、明らかに非推奨/放棄されました。
シーマス

15

@grgarsideソリューションは優れていますが、スクリプトインジェクションに対して脆弱です。これは、ログファイルの内容などを表示するためにこれを使用すると、重大なセキュリティ問題になる可能性があります。

これはより安全なはずです:

#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'

これは興味深いものですが、ユーザーが実行可能なシステムでのみ実行するスクリプトがスクリプトインジェクションに対して脆弱であるシナリオを説明できますか?
iconoclast

1
自分以外のユーザーコンテンツを表示すると、脆弱になります。たとえば、パブリックWebサーバーを備えたシステムでこれを実行する場合、またはブラウザー、メールプログラム、Twitterクライアントなど、読み取りおよび表示するネットから取得した文字列を記録するアプリがある場合。。それは、「コードを持ってして、文字列を再起動し、文字列や文を終了するかもしれない
Archimedix

さて、それは本当です。Webフォームのコンテンツを通知に含めることを想像するのは非常に困難ですが、あなたの意見は重要です。
iconoclast

1
まあ、多分あなたはI have a "laser"あなたの「単語」を「引用する」ことによって構文エラーがあると言われることなく何かを言いたいだけかもしれません。エスケープでは、次のことができますscript 'I have a "laser"'
Archimedix

1
セキュリティに留意することは常に良いことだから、賛成票を投じてください。誰かがソリューションをコピー&ペーストし、ソリューションを投稿する人が考慮しなかった方法でそれらを使用することができました。
エドワードフォーク

13

Growlは無料ではなく、10.8より前のシステムではterminal-notifierを使用できないため、cocoaDialogを使用する傾向があります。これは無料のオープンソースなので、スクリプトとともに配布することもできます。

多くのカスタマイズが必要ない場合は、AppleScriptを使用することもできます。AppleScript display notificationは、他の人が既に述べたように、シェルから呼び出すこともできます。

ただし、AppleScriptは二重引用符を必要とすることに注意してください。したがって、変数が必要な場合、これは機能しません

osascript -e "display notification '$text' with title '$title'" #WRONG

エスケープされた二重引用符を使用する必要があります。これはいですが、動作します:

osascript -e "display notification \"$text\" with title \"$title\""

これも機能しますosascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
。– MikeSchinkel

廃止されました。リンクは「GitHub Pagesサイトはありません」と表示されます。
シーマス

11

(これは、@ grgarsideの優れた答えに基づく代替実装です。)

AppleScriptはosascript、シェバン行を挿入することで直接解釈できます。

#!/usr/bin/osascript

on run argv
    if length of argv = 1 then
        display notification (item 1 of argv) with title "Notification"
    else if length of argv > 1 then
        display notification (item 1 of argv) with title (item 2 of argv)
    else
        return "<message> is required\nUsage: notify <message> [<title>]"
    end if
end run

これをnotifyパスのどこかに保存します(例:)、/usr/local/bin/notify実行可能にします(chmod +x notify)。メッセージとオプションのタイトルを受け入れます。いずれかに空白がある場合は、引用符で囲み、シェルがそれを単一の引数として解釈するようにします。

$ notify "Lorem ipsum dolor sit amet" "Testing Notifications"

これにより、他のすべての回答が脆弱なインジェクション攻撃が回避されます
ニールメイヒュー

7

OS Xのrubyスクリプトで使用しているクールなものを次に示します(ウィンドウから切り替えた後でもスクリプトを開始して更新を取得できるようにするため)。

cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )

2
うわー...だからチェーンはユーザー-> Ruby->シェル-> AppleScript-> Objective-C->アセンブリ-> CPUのようなものですか?
iconoclast

5

別の方法:

.bash_profile

function _sys_notify() {
    local notification_command="display notification \"$2\" with title \"$1\""
    osascript -e "$notification_command"
}
alias sys-notify="_sys_notify $1 $2"

コマンドを使用: sys-notify "title" "message"


5

公式文書

https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/DisplayNotifications.html

ドキュメントが移動または削除された場合に備えて、ここにテキストをコピーします。

通知を表示するには、表示通知コマンドに表示する文字列を指定します。オプションで、with title、subtitle、および音名パラメーターの値を指定して、通知が表示されたときに追加情報と音声アラートを提供します

display notification "All graphics have been converted." with title "My Graphic Processing Script" subtitle "Processing is complete." sound name "Frog"

注意

スクリプトを使用して通知を表示した後、スクリプトまたはスクリプトエディター(スクリプトがスクリプトエディター内から実行されている場合)が[システム環境設定]> [通知]の通知アプリのリストに追加されます。そこで、通知をアラートまたはバナーとして表示するかどうかなどのオプションを構成できます。

アラートスタイルの通知で[表示]ボタンをクリックすると、通知を表示したアプリが開きます。スクリプトアプリの場合、アプリを再度開くと、スクリプトの実行ハンドラーがトリガーされ、スクリプトが2回目の処理を開始する可能性があります。これを念頭に置いて、必要に応じてこのシナリオを処理するスクリプトにコードを追加してください。


1

ありがとう、これはユーザースクリプトに必要なものでした。サブタイトルとサウンドを追加するために少し変更を加えました。値が提供されない場合、無視されます。

function _sys_notify() {
local notification_command="display notification \"$2\" with title \"$1\" subtitle \"$3\" sound name \"$4\""
osascript -e "$notification_command"
}

alias sys-notify="_sys_notify $1 $2 $3 $4"

サウンドには、/ System / Library / Soundsの拡張子なしのサウンドファイル名を使用します。たとえば、ファイルPing.aiffを使用するには、Pingを4ドルで使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.