Bir Bildirim Merkezi bildirimini bir AppleScript veya kabuk komut dosyasından nasıl tetikleyebilirim?


305

Yazdığım AppleScripts ve shell scriptlerindeki 10.8 Notification Center özelliklerinden yararlanmayı çok isterim.

Bir AppleScript veya kabuk komut dosyasından kullanabileceğim yerleşik bir komut veya üçüncü taraf bir kitaplık var mı?

İdeal olarak, bildirimin türü ve simgesi kontrol edilebilir, ancak yalnızca bir hisse senedi simgesi olan temel bir afişi tetikleme yeteneği (ancak özel metin) bile takdir edilebilir.


Yanıtlar:


428

Mavericks ve sonraki sürümlerinde, bunu AppleScript'in 'ekran bildirimini' kullanarak yapabilirsiniz:

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

                          

İşte bu - kelimenin tam anlamıyla bu kadar basit! Hiçbir 3. parti kütüphanesi veya uygulaması gerekli değildir ve diğer sistemlerde kullanılmak üzere tamamen taşınabilirdir. Üstte 10.9, ortada 10.10, altta 10.10 bildirim.

AppleScript, / usr / bin / osascript kullanılarak kabuktan çalıştırılabilir:

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

Uyarıyı daha sonra ekleyerek de özelleştirebilirsiniz.

  • bir altyazı

    'Altyazı'yı, ardından altyazıyı içeren dizgiyi veya değişkeni ekleyin.

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

    Yukarıdaki örnek aşağıdaki bildirimi üretir:

  • ses

    Bildirim ile birlikte çalınacak sesin arkasına 'ses adı' ekleyin.

    display notification "message" sound name "Sound Name"

    Geçerli ses adları, içinde bulunan seslerin isimleridir.

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

Bildirimler göndermek bir komut satırı komut dosyası olarak kaydırılabilir. Aşağıdaki kod Terminal'de çalıştırılabilir ve / usr / local / bin dizinine bir komut dosyası ekler (var olmalı, $ PATH dizinine ekleyin) notify.

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

Bu, yukarıdakilerin bildirmek için ekleyeceği komut dosyasıdır.

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

Şimdi bir bildirim görüntülemek için:

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

9
@ceilingcat Bu AppleScript'tir. Terminal'de çalıştırmak için osascript kullanın (cevaba bakınız).
grg

8
Tek sorun, display notificationüzerine tıkladığınızda, açık dosya iletişim kutusunun görünmesidir.
Augoƃı 13:14

7
Bildirici açılır pencerenin kullanıcı tarafından açıkça tıklanana kadar sonsuza dek (N saniye sonra otomatik olarak gizlenmez) var olması mümkün mü?
Sridhar Ratnakumar

25
Bayanlar baylar, dünya çapındaki ağda bir saatlik bir araştırmadan sonra, kullanıcı tarafından reddedilene kadar bildirim penceresinin nasıl kalmasına izin vereceğimi öğrendim! Aslında yazılı komut dosyasındaki bazı parametreler yerine Sistem Tercihindeki bir ayar ile kontrol edildi. Hepsini açıklamalıdır Bu iki resim i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg eğlenceli adamlar var, ve teşekkürler harika cevap için @grgarside.
Vic Jang

4
Metnin çift tırnak içine alınması gerektiğini unutmayın. Tek tırnaklar çalışmıyor. Eğer metinde bir değişken gerekiyorsa Yani, yazamıyorum "display ... '$mytext' ...", ama gerek çift tırnak kaçtı: "display notification \"$mytext\" ...".
mivk

93

terminal bildirim

README'den:

terminal-notifier, Mac OS X 10.8'de bulunan Mac OS X Kullanıcı Bildirimlerini göndermek için kullanılan bir komut satırı aracıdır.

Şu anda bir uygulama paketi olarak paketlenmiştir, çünkü NSUserNotificationbir 'Temel araçtan' çalışmaz. Radar: // 11956694

Bu araç, Kicker tarafından dosya sistemi değişiklikleri nedeniyle yürütülen komutların durumunu göstermek için kullanılacaktır . (v3.0.0)

İndir

Kodlanmış ve kullanıma hazır olan önceden oluşturulmuş ikili dosyalar indirme bölümünden edinilebilir .

kullanım

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

Terminal-notifier'ı kullanmak için uygulama paketinin içindeki ikiliyi çağırmanız gerekir .

İlk argüman bir bildirimin ait olduğu 'grubu' belirtir. Herhangi bir 'grup' için , önceden yayınlanan bildirimlerin yerine yalnızca bir bildirim gösterilecektir. Örnekler: bildirimleri benzersiz bir işlemle kapsamlamak için gönderenin işlem kimliği veya bir proje tarafından bildirimleri kapsamlamak için mevcut çalışma dizini.

İkinci ve üçüncü argümanlar bildirimin kendisini tanımlar ve sırasıyla 'başlık' ve 'mesaj' dır. Örneğin, bir bildirimin göndereni kullanıcıya bildirmek için gönderenin adını başlık olarak belirtebilirsiniz.

Dördüncü ve son argüman isteğe bağlıdır. Kullanıcı bildirimi tıkladığında hangi uygulamanın etkinleştirilmesi gerektiğini belirtir. Bu, varsayılan olarak Terminal.app'i etkinleştirir, bunun yerine uygulamanın paket tanımlayıcısını belirtmek yerine başka bir uygulamayı başlatmak için. Örneğin, Safari.app kullanımını başlatmak için: com.apple.Safari.


Tatlı, harika bir kütüphane! Bu simge üzerinde kontrol ile güncellenen görmek ve afiş vs uyarmak isterdim, ama kesinlikle yararlı. Bağlantı için teşekkürler! i.imgur.com/tsCeK.png
Nathan Greenstein

2
Büyük küçük uygulama, bir başlatıcı oluşturdum ve / usr / local / bin dizinine koydum, böylece bir terminal vb. Herhangi bir yerden kullanabilirim. Başlatıcı betiği: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/ MacOS ./terminal-notifier $ *
johanandren

4
Başlatıcı, biraz değiştirirseniz, boşluk içeren ve alıntı yapılan bir metinle çalışır: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard

27

Sadece @ grgarside'ın cevabına bir not eklemek istiyorum, çünkü birçok kişinin sadece butona basılarak reddedilebilecek bir bildirim penceresi açmak istediğini biliyorum.

karşılaştırma

Sizin için çözümü buldum:

Aslında yazılı komut dosyasındaki bazı parametreler yerine Sistem Tercihindeki bir ayar ile kontrol edildi. Bu iki görüntü hepsini açıklamalı

Harika cevap için teşekkürler @grgarside.

Sistem Tercihi


5
Belirli uygulamanın değişeceğini unutmayın. Script Editorsadece Script Editor.appve içindir osascript. Bir servis iş akışında öyle Automator Runner. İçerideyken Automator.app, öyle Automator.
cde

1
Pankartı tıklarsam, Komut Dosyası Düzenleyici uygulamasını getirdiğini sinir bozucu buluyorum. Tıklamadan
Joshua Goldberg

@JoshuaGoldberg Bunu eklediğiniz için teşekkürler! Bir gün sezgisel olarak buldum, Mac OS X'de sevdiğim şeylerden biri, çalışmasını beklediğiniz gibi çalışıyor :)
Vic Jang

22

Bunu Growl2 ile yapabilirsiniz ( App Store'dan edinilebilir ). Growl'u yükleyin ve "OS X Bildirimleri" ni etkinleştirin (ekran görüntüsü)

görüntü tanımını buraya girin

Ayrıca, Growl bildirimleri göndermek için bir komut satırı aracı için GrowlNotify yazılımını da yüklemeniz gerekir. İndirme sayfasında bu aracı ücretsiz olarak indirebilirsiniz .

Artık Büyüme bildirimlerini, Bildirim Merkezi'ne iletilecek olan komut satırından oluşturabilirsiniz. Örneğin:

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

görüntü tanımını buraya girin

Uygulama simgesini değiştirmek şu anda mümkün görünmemektedir.


1
Özellikle growl zaten kurulmuşsa iyi bir yaklaşım.
Besi

1
--icon path/to/icon.pngSimgeler için seçeneği kullanabileceğinizi düşünüyorum .
Will

Kullanımdan kaldırıldı / artık korunmuyor mu? Son güncelleme macos için 10.9 mavericks oldu
Seamus

15

Kısa süre önce bildirim bildirimlerini (eylemlerle birlikte) ve Yanıt Türü Uyarıları'nı görüntülemek üzere bir komut satırı aracı oluşturmak için terminal-notifier'ı çatalladım.

Kullanıcılardan etkileşimli cevaplar almak için kabuk komut dosyalarım ve golang uygulamaları ile kullanıyorum.

https://github.com/vjeantet/alerter

görüntü tanımını buraya girin


1
Ayrıca görünüşe göre kullanımdan kaldırılmış / terk edilmiş.
Seamus

15

@grgarside 'ın çözüm güzel, ama bu ekran günlük dosyası içeriğini veya benzer bir şey örneğin için kullanıldığında önemli bir güvenlik sorunu olabilir komut enjeksiyonu, karşı savunmasızdır.

Bu daha güvenli olmalı:

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

bu ilginç, ancak sistemimde çalıştırdığım ve yalnızca kullanıcı tarafından çalıştırılabilen bir komut dosyasının komut dosyası enjeksiyonuna açık olduğu bir senaryo tanımlayabilir misiniz?
iconoclast

1
Sizden olmayan kullanıcı içeriğini görüntülerseniz, savunmasız kalırsınız. Örneğin, bunu kamuya açık bir web sunucusuna sahip bir sistemde çalıştırıyorsanız veya bazı uygulamalar dizeleri günlüğe kaydederse, okuduğunuz ve görüntülediğiniz ağdan, örneğin bir tarayıcı, posta programı veya bir Twitter istemcisi kullanıyorsanız. "Dize ve ifadeyi sonlandırmak, sonra kodu olmak ve daha sonra bir dizgiyi yeniden başlatmak için" olabilir.
Archimedix

tamam, bu doğru. web formlarından gelen içeriği bildirimlerime koyduğumu düşünmek benim için çok zor, ancak amacınız dikkate alındı.
iconoclast

1
Eh, belki de I have a "laser""sözlerin" ifadesinden "alıntı yaparak" sözdizimi hatası yaşadığın söylenmemiş gibi bir şey söylemek istersin . Kaçış ile şunları yapabilirsiniz:script 'I have a "laser"'
Archimedix

1
Yükseltme, çünkü güvenliği akılda tutmak her zaman iyidir. Biri makarna çözümlerini kopyalayabilir ve çözümü gönderen kişinin dikkate almadığı şekillerde kullanabilir.
Edward Falk

13

Growl serbest olmadığından ve 10.8 öncesi sistemlerde terminal-notifier bulunmadığından, cocoaDialog kullanmaya meyilliyim . Ücretsiz ve açık kaynak kodudur, bu yüzden muhtemelen senaryolarınızla birlikte dağıtabilirsiniz.

Çok fazla kişiselleştirmeye ihtiyacınız yoksa display notification, başkalarının da söylediği gibi kabuktan arayabileceğiniz AppleScript'i de kullanabilirsiniz .

Ancak, AppleScript'in çift tırnak gerektirdiğini göründüğüne dikkat edin. Yani değişkenlere ihtiyacınız varsa bu işe yaramaz :

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

Kaçan çift tırnak kullanmak zorunda kalacak. Bu çirkin ama işe yarıyor :

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

Bu aynı zamanda çalışır:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel 12:17

Ayrıca kullanımdan kaldırıldı. Link, "Burada GitHub Pages sitesi yok."
Seamus

11

(Bu @ grgarside'ın mükemmel cevabına dayanan alternatif bir uygulamadır.)

AppleScript doğrudan osascriptshebang satırına yerleştirilerek yorumlanabilir .

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

Bunu notifyyolunuzdaki bir yere kaydedin, örneğin, /usr/local/bin/notifyçalıştırılabilir hale getirin ( chmod +x notify). Bir mesajı ve isteğe bağlı bir başlığı kabul eder. Her ikisinde de boşluk varsa, tırnak işaretleri içine alın, böylece kabuk onu tek bir argüman olarak yorumlar.

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

Bu, diğer tüm cevapların savunmasız olduğu enjeksiyon saldırılarını önler
Neil Mayhew

7

İşte OS X'te bir yakut komut dosyasında kullandığım harika bir örnek (böylece bir komut dosyasını başlatabilir ve pencereden ayrıldıktan sonra bile bir güncelleme alabilirim):

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

2
vay ... yani zincir Kullanıcı gibi bir şeydir -> Ruby -> Shell -> AppleScript -> Objective-C -> Assembly -> CPU?
iconoclast

5

Bir alternatif:

İçinde .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"

Komutunu kullanın: sys-notify "title" "message"


5

Resmi belgeler

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

Belgenin taşınması veya kaldırılması durumunda metni buraya kopyalamak.

Bir bildirim göstermek için, ekran bildirim komutunu gösterilecek bir dizeyle verin. İsteğe bağlı olarak, bildirim göründüğünde ek bilgi ve sesli bir uyarı sağlamak için başlık, alt başlık ve ses adı parametreleri için değerler sağlayın

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

NOT

Bir bildirimi görüntülemek için bir komut dosyası kullandıktan sonra, komut dosyası veya Komut Dosyası Düzenleyicisi (komut dosyası Komut Dosyası Düzenleyicisi'nden çalıştırılıyorsa) Sistem Tercihleri> Bildirimler'deki uygulamaları bildiren listesine eklenir. Burada, bildirimlerin uyarı mı, afiş olarak mı görüntüleneceği gibi seçenekleri yapılandırabilirsiniz.

Uyarı tarzı bir bildirimde Göster düğmesini tıklatmak, bildirimi görüntüleyen uygulamayı açar. Bir komut dosyası uygulaması için, uygulamayı tekrar açma eylemi, komut dosyasının çalıştırma işleyicisini tetikleyerek potansiyel olarak komut dosyasının ikinci kez işlemeye başlamasına neden olur. Bunu aklınızda bulundurun ve uygunsa bu senaryoyu ele almak için komut dosyasına kod ekleyin.


1

Teşekkürler, bu sadece bazı kullanıcı scriptleri için ihtiyacım olan şeydi. Bir altyazı ve ses eklemek için küçük bir değişiklik yaptım. Bir değer belirtilmezse, dikkate alınmaz.

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"

Ses için / System / Library / Sounds uzantısına sahip olmayan bir ses dosya adı kullanın. Örneğin, Ping.aiff dosyasını kullanmak için 4 ABD doları için Ping kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.