Bagaimana saya bisa memicu notifikasi Pusat Pemberitahuan dari skrip AppleScript atau shell?

305

Saya senang bisa memanfaatkan fitur Notification Center 10.8 di AppleScripts dan shell script yang saya tulis.

Apakah ada perintah bawaan atau pustaka pihak ketiga yang dapat saya gunakan dari skrip AppleScript atau shell?

Idealnya jenis dan ikon pemberitahuan dapat dikontrol, tetapi bahkan hanya kemampuan untuk memicu spanduk dasar dengan ikon stok (tetapi teks khusus) akan dihargai.

Nathan Greenstein
sumber

Jawaban:

428

Dengan Mavericks dan yang lebih baru, Anda dapat melakukan ini menggunakan 'pemberitahuan tampilan' AppleScript:

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

                          

Itu saja — secara harfiah sesederhana itu! Tidak ada 3 rd perpustakaan -party atau aplikasi yang diperlukan dan benar-benar portabel untuk digunakan pada sistem lain. 10.9 notifikasi di atas, 10.10 DP di tengah, 10.10 di bawah.

AppleScript dapat dijalankan dari shell menggunakan / usr / bin / osascript:

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

Anda juga dapat menyesuaikan lansiran lebih lanjut dengan menambahkan ...

  • subtitle

    Tambahkan 'subtitle' diikuti oleh string atau variabel yang berisi subtitle.

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

    Contoh di atas menghasilkan pemberitahuan berikut:

  • suara

    Tambahkan 'nama suara' diikuti dengan nama suara yang akan diputar bersama dengan notifikasi.

    display notification "message" sound name "Sound Name"

    Nama suara yang valid adalah nama suara yang berada di ...

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

Posting pemberitahuan dapat dibungkus sebagai skrip baris perintah. Kode berikut dapat dijalankan di Terminal dan akan menambahkan skrip ke / usr / local / bin (harus ada, tambahkan ke $ PATH) yang dipanggil notify.

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

Ini adalah skrip yang akan ditambahkan di atas untuk memberi tahu.

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

Sekarang untuk menampilkan pemberitahuan:

notify Lorem ipsum dolor sit amet
sleep 5; notify Slow command finished
GRG
sumber
9
@ceilingcat Ini adalah AppleScript. Untuk menjalankannya di Terminal, gunakan osascript (lihat jawaban).
GRG
8
Satu-satunya masalah display notificationadalah ketika Anda mengkliknya, dialog file terbuka muncul.
ɹoƃı
7
Apakah mungkin membuat popup notificatiop ada selamanya (bukan sembunyi otomatis setelah N detik) hingga diklik secara eksplisit oleh pengguna?
Sridhar Ratnakumar
25
Hadirin sekalian, setelah satu jam penyelidikan di world wide web, saya telah menemukan cara untuk membiarkan jendela pemberitahuan tetap sampai diberhentikan oleh pengguna! Itu sebenarnya dikendalikan oleh pengaturan di System Preference, daripada beberapa parameter dalam skrip yang ditulis. Kedua gambar harus menjelaskan semuanya i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg Bersenang-senang guys, dan terima kasih @grgarside atas jawaban yang bagus.
Vic Jang
4
Perhatikan bahwa teks harus dalam tanda kutip ganda. Kutipan tunggal tidak berfungsi. Jadi jika Anda perlu variabel dalam teks, Anda tidak bisa menulis "display ... '$mytext' ...", tapi kebutuhan lolos tanda kutip ganda: "display notification \"$mytext\" ...".
mivk
93

terminal-notifier

Dari README:

terminal-notifier adalah alat baris perintah untuk mengirim Pemberitahuan Pengguna Mac OS X, yang tersedia di Mac OS X 10.8.

Saat ini dikemas sebagai bundel aplikasi, karena NSUserNotificationtidak berfungsi dari 'alat Yayasan'. radar: // 11956694

Alat ini akan digunakan oleh Kicker untuk menunjukkan status perintah yang dieksekusi karena perubahan sistem file. (v3.0.0)

Unduh

Binari prebuilt, yang bertanda-kode dan siap digunakan, tersedia dari bagian unduhan .

Pemakaian

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

Untuk menggunakan terminal-notifier, Anda harus memanggil biner di dalam bundel aplikasi.

Argumen pertama menentukan 'grup' milik notifikasi. Untuk 'grup' apa pun, hanya satu pemberitahuan yang akan ditampilkan, menggantikan pemberitahuan yang diposkan sebelumnya. Contohnya adalah: ID proses pengirim untuk membuat ruang lingkup pemberitahuan dengan proses unik, atau direktori kerja saat ini untuk ruang lingkup pemberitahuan oleh suatu proyek.

Argumen kedua dan ketiga menggambarkan pemberitahuan itu sendiri dan 'judul' dan 'pesan' masing-masing. Misalnya, untuk mengomunikasikan pengirim notifikasi kepada pengguna, Anda dapat menentukan nama pengirim sebagai judul.

Argumen keempat dan terakhir adalah argumen opsional. Ini menentukan aplikasi mana yang harus diaktifkan ketika pengguna mengklik pemberitahuan. Secara default ini akan mengaktifkan Terminal.app, untuk meluncurkan aplikasi lain sebagai gantinya menentukan pengidentifikasi bundel aplikasi. Misalnya, untuk meluncurkan Safari.app digunakan: com.apple.Safari.

Steve Moser
sumber
Manis, perpustakaan yang bagus! Akan senang melihatnya diperbarui dengan kontrol atas ikon dan peringatan vs spanduk, tapi pasti berguna. Terima kasih untuk tautannya! i.imgur.com/tsCeK.png
Nathan Greenstein
2
Aplikasi kecil yang hebat, saya membuat peluncur dan memasukkan / usr / local / bin sehingga saya dapat menggunakannya di mana saja dari terminal dll. Skrip peluncur: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./terminal-notifier $ *
johanandren
4
Peluncur sangat membantu, jika Anda mengubahnya sedikit berfungsi dengan teks yang dikutip dengan spasi: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard
27

Saya hanya ingin menambahkan catatan ke jawaban @ grgarside, karena saya tahu banyak orang ingin memiliki pemberitahuan popup yang hanya dapat diabaikan oleh klik tombol.

Perbandingan

Saya telah menemukan solusi untuk Anda:

Itu sebenarnya dikendalikan oleh pengaturan di System Preference, daripada beberapa parameter dalam skrip yang ditulis. Kedua gambar ini harus menjelaskan semuanya

Terima kasih @grgarside atas jawaban yang bagus.

Preferensi Sistem

Vic Jang
sumber
5
Perhatikan bahwa aplikasi spesifik akan bervariasi. Script Editorhanya untuk Script Editor.appdan osascript. Dalam alur kerja layanan, itu Automator Runner. Ketika di dalam Automator.app, itu Automator.
cde
1
Saya merasa menjengkelkan bahwa jika saya mengklik Banner, itu memunculkan aplikasi Script Editor. Saya ingin itu hilang begitu saja pada klik, tetapi posting ini menunjukkan Anda dapat mengarahkan mouse ke sana dan geser trackpad ke kanan untuk membuatnya menghilang dengan tenang: osxdaily.com/2012/09/05/05 ...
Joshua Goldberg
@ JoshuaGoldberg Terima kasih telah menambahkan itu! Saya menemukan itu secara intuitif suatu hari, yang merupakan satu hal yang saya sukai dari Mac OS X, ini berfungsi seperti yang Anda harapkan bekerja :)
Vic Jang
22

Anda sekarang dapat melakukan ini dengan Growl2 ( tersedia dari App Store ). Instal Growl dan aktifkan "Pemberitahuan OS X" (tangkapan layar)

masukkan deskripsi gambar di sini

Selain itu, Anda harus menginstal GrowlNotify untuk alat baris perintah untuk mengirim pemberitahuan Growl. Anda dapat mengunduh alat ini secara gratis di halaman Unduh .

Anda sekarang dapat menghasilkan pemberitahuan Growl dari baris perintah, yang akan diteruskan ke Pusat Pemberitahuan. Sebagai contoh:

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

masukkan deskripsi gambar di sini

Perhatikan bahwa saat ini tampaknya tidak mungkin untuk mengubah ikon aplikasi.

Gerry
sumber
1
Pendekatan yang bagus terutama jika growl sudah diinstal.
Besi
1
Saya pikir Anda mungkin dapat menggunakan opsi --icon path/to/icon.pnguntuk ikon.
Will
Sudah usang / tidak lagi dipertahankan? Pembaruan terakhir untuk macos 10.9 mavericks
Seamus
15

Saya baru-baru ini bercabang terminal-notifier untuk membangun alat baris perintah untuk menampilkan Pemberitahuan notifikasi (dengan tindakan) dan Balas Jenis Peringatan.

Saya menggunakannya dengan skrip shell dan aplikasi golang untuk mendapatkan jawaban interaktif dari pengguna.

https://github.com/vjeantet/alerter

masukkan deskripsi gambar di sini

vjeantet
sumber
1
Rupanya juga ditinggalkan / ditinggalkan.
Seamus
15

@grgarside 's solusi bagus, tetapi rentan terhadap injeksi script, yang bisa menjadi masalah keamanan utama ketika ini digunakan untuk misalnya isi file layar log atau yang serupa.

Ini harus lebih aman:

#!/bin/bash
X="$*" /usr/bin/osascript -e 'display notification system attribute "X"'
Archimedix
sumber
ini menarik, tetapi bisakah Anda menggambarkan skenario di mana skrip yang saya jalankan di sistem saya yang hanya dapat dijalankan oleh pengguna rentan terhadap injeksi skrip?
iconoclast
1
Jika Anda menampilkan konten pengguna yang bukan dari Anda, Anda rentan. Misalnya jika Anda menjalankan ini pada sistem dengan server web publik, atau ketika beberapa log aplikasi mengambilnya dari internet yang Anda baca dan tampilkan, misalnya browser, program surat, atau klien Twitter. Itu bisa memiliki "untuk mengakhiri string dan pernyataan, kemudian memiliki kode dan kemudian restart string.
Archimedix
oke itu benar sulit bagi saya untuk membayangkan pernah memasukkan konten dari formulir web ke notifikasi saya, tetapi maksud Anda diambil.
iconoclast
1
Yah, mungkin Anda hanya ingin mengatakan sesuatu seperti I have a "laser"tanpa diberi tahu bahwa Anda memiliki kesalahan sintaks dengan "mengutip" kata-kata "Anda". Dengan melarikan diri, Anda dapat:script 'I have a "laser"'
Archimedix
1
Jengkel karena selalu baik untuk menjaga keamanan. Seseorang dapat menyalin solusi pasta dan menggunakannya dalam cara orang yang memposting solusi tidak mempertimbangkan.
Edward Falk
13

Karena Growl tidak gratis, dan terminal-notifier tidak tersedia pada sistem pra-10.8, saya cenderung menggunakan cocoaDialog . Ini gratis dan open source, jadi Anda mungkin dapat juga mendistribusikan bersama skrip Anda.

Jika Anda tidak membutuhkan banyak penyesuaian, Anda juga dapat menggunakan AppleScript display notificationyang juga dapat Anda hubungi dari shell seperti yang telah disebutkan orang lain.

Tetapi berhati-hatilah karena AppleScript tampaknya membutuhkan tanda kutip ganda. Jadi, jika Anda memerlukan variabel, ini tidak akan berfungsi :

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

Anda harus menggunakan tanda kutip ganda yang diloloskan. Ini jelek tapi berhasil :

osascript -e "display notification \"$text\" with title \"$title\""
mivk
sumber
Ini juga berfungsi:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel
Juga sudah usang. Tautan menghasilkan "Tidak ada situs Halaman GitHub di sini."
Seamus
11

(Ini adalah implementasi alternatif berdasarkan jawaban luar biasa @ grgarside.)

AppleScript dapat diartikan secara langsung dengan memasukkan osascriptgaris shebang.

#!/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

Simpan ini sebagai notifysuatu tempat di jalur Anda, mis. /usr/local/bin/notify, Dan membuatnya dapat dieksekusi ( chmod +x notify). Ia menerima pesan dan judul opsional. Jika salah satu memiliki spasi, bungkus dengan tanda kutip sehingga shell menafsirkannya sebagai argumen tunggal.

$ notify "Lorem ipsum dolor sit amet" "Testing Notifications"
Steve
sumber
Ini menghindari serangan injeksi yang rentan terhadap semua jawaban lainnya
Neil Mayhew
7

Inilah yang keren yang saya gunakan dalam skrip ruby ​​di OS X (sehingga saya bisa memulai skrip dan mendapatkan pembaruan bahkan setelah beralih dari jendela):

cmd = %Q|osascript -e 'display notification "Server was reset" with title "Posted Update"'|
system ( cmd )
JayCrossler
sumber
2
wow ... jadi rantai itu seperti Pengguna -> Ruby -> Shell -> AppleScript -> Objective-C -> Assembly -> CPU?
iconoclast
5

Sebuah alternatif:

Di .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"

Gunakan perintah: sys-notify "title" "message"

ronald8192
sumber
5

Dokumentasi resmi

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

Menyalin teks di sini, seandainya dokumen dipindahkan atau dihapus.

Untuk menampilkan pemberitahuan, berikan perintah tampilan pemberitahuan dengan string untuk ditampilkan. Secara opsional, berikan nilai untuk parameter judul, subtitle, dan nama suara untuk memberikan informasi tambahan dan peringatan yang terdengar ketika pemberitahuan muncul

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

CATATAN

Setelah menggunakan skrip untuk menampilkan pemberitahuan, skrip atau Editor Skrip (jika skrip dijalankan dari dalam Skrip Editor) ditambahkan ke daftar aplikasi notifikasi di System Preferences> Notifications. Di sana, Anda dapat mengonfigurasi opsi, seperti apakah akan menampilkan pemberitahuan sebagai peringatan atau spanduk.

Mengklik tombol Show di notifikasi bergaya peringatan membuka aplikasi yang menampilkan notifikasi. Untuk aplikasi skrip, tindakan membuka aplikasi lagi memicu run handler skrip, berpotensi menyebabkan skrip mulai memproses kedua kalinya. Ingatlah hal ini, dan tambahkan kode ke skrip Anda untuk menangani skenario ini, jika sesuai.

nishanth
sumber
1

Terima kasih, ini hanya yang saya butuhkan untuk beberapa skrip pengguna. Saya membuat sedikit modifikasi untuk menambahkan subtitle dan suara. Jika nilai tidak diberikan, nilai itu diabaikan.

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"

Untuk suara, gunakan nama file suara tanpa ekstensi dari / System / Library / Sounds. Misalnya, untuk menggunakan file Ping.aiff, gunakan Ping untuk $ 4

Kevin Mason
sumber