मैं AppleScript या शेल स्क्रिप्ट से सूचना केंद्र सूचना कैसे ट्रिगर कर सकता हूं?


305

मैं AppleScripts और शेल स्क्रिप्ट में लिखी गई 10.8 की अधिसूचना केंद्र सुविधाओं का लाभ उठाने में सक्षम होना चाहूंगा।

क्या एक अंतर्निहित कमांड या एक तृतीय-पक्ष लाइब्रेरी है जिसका उपयोग मैं या तो AppleScript या शेल स्क्रिप्ट से कर सकता हूं?

आदर्श रूप से अधिसूचना के प्रकार और आइकन को नियंत्रित किया जा सकता है, लेकिन यहां तक ​​कि स्टॉक आइकन (लेकिन कस्टम पाठ) के साथ एक बुनियादी बैनर को ट्रिगर करने की क्षमता की सराहना की जाएगी।


जवाबों:


428

Mavericks के साथ और बाद में, आप AppleScript की 'डिस्प्ले नोटिफिकेशन' का उपयोग करके ऐसा कर सकते हैं:

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

                          

यह सचमुच है कि सरल! कोई 3 rd -party लाइब्रेरी या एप्लिकेशन की आवश्यकता नहीं है और अन्य प्रणालियों पर उपयोग के लिए पूरी तरह से पोर्टेबल है। शीर्ष पर 10.9 अधिसूचना, मध्य में 10.10 डीपी, नीचे 10.10।

AppleScript शेल से उपयोग किया जा सकता है / usr / bin / osascript:

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

आप आगे जोड़कर अलर्ट को कस्टमाइज़ भी कर सकते हैं ...

  • एक उपशीर्षक

    उप-उपशीर्षक के साथ स्ट्रिंग या चर के बाद 'उपशीर्षक' को जोड़ें।

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

    उपरोक्त उदाहरण निम्नलिखित अधिसूचना तैयार करता है:

  • ध्वनि

    अधिसूचना के साथ खेला जाएगा कि एक ध्वनि के नाम के बाद 'ध्वनि का नाम' जोड़ें।

    display notification "message" sound name "Sound Name"

    मान्य ध्वनि नाम ध्वनियों के नाम हैं ...

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

पोस्टिंग सूचनाओं को कमांड-लाइन स्क्रिप्ट के रूप में लपेटा जा सकता है। निम्नलिखित कोड को टर्मिनल में चलाया जा सकता है और इसमें स्क्रिप्ट / usr / लोकल / बिन (मौजूद होना चाहिए, जिसे $ 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 है। इसे टर्मिनल में चलाने के लिए, ऑसस्क्रिप्ट (उत्तर देखें) का उपयोग करें।
GRG

8
इसके साथ एकमात्र समस्या display notificationयह है कि जब आप इस पर क्लिक करते हैं, तो खुले फ़ाइल संवाद प्रकट होता है।
ɹo .ı

7
क्या यह संभव है कि notificatiop पॉपअप हमेशा के लिए मौजूद हो (एन सेकंड के बाद ऑटो-हाइड न हो) जब तक उपयोगकर्ता द्वारा स्पष्ट रूप से क्लिक नहीं किया जाता है?
श्रीधर रत्नाकुमार

25
महिलाओं और सज्जनों, विश्व व्यापी वेब पर एक घंटे की जांच के बाद, मुझे पता चला है कि उपयोगकर्ता द्वारा खारिज किए जाने तक अधिसूचना विंडो को कैसे रहने दिया जाए! लिखित स्क्रिप्ट में कुछ पैरामीटर के बजाय, सिस्टम वरीयता में एक सेटिंग द्वारा इसे वास्तव में नियंत्रित किया गया था। इन दो छवियों को यह सब स्पष्ट करना चाहिए i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg मज़ेदार लोग हैं, और महान उत्तर के लिए @grgarside धन्यवाद।
विक जंग

4
ध्यान दें कि पाठ को दोहरे उद्धरण चिह्नों में होना है। एकल उद्धरण काम नहीं करते। इसलिए यदि आपको पाठ में एक चर की आवश्यकता है, तो आप नहीं लिख सकते हैं "display ... '$mytext' ...", लेकिन बच गए दोहरे उद्धरण चिह्नों की आवश्यकता है "display notification \"$mytext\" ...":।
११

93

टर्मिनल-सूचक

README से:

टर्मिनल-नोटिफायर मैक ओएस एक्स यूजर नोटिफिकेशन भेजने के लिए एक कमांड-लाइन टूल है, जो मैक ओएस एक्स 10.8 में उपलब्ध हैं।

वर्तमान में इसे एक एप्लिकेशन बंडल के रूप में पैक किया गया है, क्योंकि NSUserNotificationयह 'फाउंडेशन टूल' से काम नहीं करता है। रडार: // 11956694

इस उपकरण का उपयोग किकर द्वारा उन कमांड की स्थिति को दिखाने के लिए किया जाएगा जो फाइलसिस्टम में बदलाव के कारण निष्पादित होते हैं। (v3.0.0)

डाउनलोड

प्रीबिल्ट बायनेरिज़, जो कोड-हस्ताक्षरित और उपयोग करने के लिए तैयार हैं, डाउनलोड अनुभाग से उपलब्ध हैं ।

प्रयोग

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

टर्मिनल-नोटिफ़ायर का उपयोग करने के लिए, आपको ऐप बंडल के अंदर बाइनरी को कॉल करना होगा ।

पहला तर्क निर्दिष्ट करता है कि 'समूह' एक अधिसूचना से संबंधित है। किसी भी 'समूह' के लिए केवल एक अधिसूचना कभी भी दिखाई जाएगी, पहले से पोस्ट किए गए नोटिफिकेशन की जगह। उदाहरण हैं: एक अनोखी प्रक्रिया द्वारा सूचनाओं को गुंजाइश करने के लिए प्रेषक की प्रक्रिया आईडी, या किसी परियोजना द्वारा सूचनाओं को गुंजाइश करने के लिए वर्तमान कार्यशील निर्देशिका।

दूसरे और तीसरे तर्क स्वयं अधिसूचना का वर्णन करते हैं और क्रमशः इसके 'शीर्षक' और 'संदेश' हैं। उदाहरण के लिए, उपयोगकर्ता को एक अधिसूचना भेजने वाले को संवाद करने के लिए, आप प्रेषक का नाम शीर्षक के रूप में निर्दिष्ट कर सकते हैं।

चौथा और अंतिम तर्क एक वैकल्पिक है। यह निर्दिष्ट करता है कि उपयोगकर्ता द्वारा अधिसूचना पर क्लिक करने पर कौन सा एप्लिकेशन सक्रिय होना चाहिए। डिफ़ॉल्ट रूप से यह किसी अन्य एप्लिकेशन को लॉन्च करने के लिए Terminal.app को सक्रिय करेगा, इसके बजाय एप्लिकेशन के बंडल पहचानकर्ता को निर्दिष्ट करें। उदाहरण के लिए, Safari.app उपयोग शुरू करने के लिए: com.apple.Safari


स्वीट, एक बेहतरीन लाइब्रेरी! आइकन और अलर्ट बनाम बैनर पर नियंत्रण के साथ इसे अपडेट देखना अच्छा लगेगा, लेकिन निश्चित रूप से उपयोगी है। लिंक के लिए धन्यवाद! i.imgur.com/tsCeK.png
नाथन ग्रीनस्टीन

2
महान छोटे अनुप्रयोग, मैंने एक लांचर बनाया और / usr / स्थानीय / बिन में डाल दिया ताकि मैं इसे किसी टर्मिनल आदि लॉन्चर स्क्रिप्ट से कहीं भी उपयोग कर सकूँ: #! / Bin / bash cd /Applications/terminal-notifier.app.Contents/ MacOS ./terminal-notifier $ *
जोहानैंड्रन

4
लॉन्चर मददगार है, अगर आप इसे थोड़ा बदलते हैं तो यह रिक्त स्थान के साथ उद्धृत पाठ के साथ काम करता है: #! / Bin / bash cd /Applications/terminal-notifier.app/Contents/MacOS/terminal-notifier "$ @"
Redbeard

27

मैं सिर्फ @ ग्रामसाइड के उत्तर में एक नोट जोड़ना चाहता हूं, क्योंकि मुझे पता है कि बहुत से लोग एक अधिसूचना पॉपअप करना चाहते हैं जिसे केवल बटन क्लिक द्वारा खारिज किया जा सकता है।

तुलना

मैंने आपके लिए समाधान ढूंढ लिया है:

लिखित स्क्रिप्ट में कुछ पैरामीटर के बजाय यह सिस्टम वरीयता में एक सेटिंग द्वारा वास्तव में नियंत्रित किया गया था। इन दो छवियों को यह सब समझाना चाहिए

महान उत्तर के लिए धन्यवाद @grgarside।

सिस्टम वरीयता


5
ध्यान दें कि विशिष्ट ऐप अलग-अलग होंगे। Script Editorकेवल के लिए है Script Editor.appऔर osascript। सेवा वर्कफ़्लो में, यह है Automator Runner। जब अंदर है Automator.app, यह है Automator
cd

1
मुझे यह कष्टप्रद लगता है कि अगर मैं बैनर पर क्लिक करता हूं, तो यह स्क्रिप्ट एडिटर एप्लिकेशन को लाता है। मैं इसके लिए क्लिक पर गायब होना चाहता / चाहती हूं, लेकिन यह पोस्ट बताती है कि आप इस पर मंडरा सकते हैं और ट्रैकपैड-स्वाइप कर सकते हैं कि इसे चुपचाप हटा दें
यहोशू गोल्डबर्ग

@ JoshuaGoldberg कि जोड़ने के लिए धन्यवाद! मैंने पाया कि सहजता से एक दिन, जो एक चीज है जो मुझे मैक ओएस एक्स के बारे में पसंद है, यह आपके काम करने के तरीके की उम्मीद करता है :)
विक जंग

22

अब आप इसे ग्रोएल 2 ( ऐप स्टोर से उपलब्ध ) के साथ कर सकते हैं । बढ़ो स्थापित करें और "OS X सूचनाएं" सक्षम करें (स्क्रीनशॉट)

यहां छवि विवरण दर्ज करें

इसके अतिरिक्त, आपको ग्रोनल नोटिफिकेशन भेजने के लिए एक कमांड-लाइन टूल के लिए GrowlNotify इंस्टॉल करना होगा। आप इस टूल को डाउनलोड पेज पर मुफ्त में डाउनलोड कर सकते हैं ।

अब आप कमांड लाइन से Growl नोटिफिकेशन जेनरेट कर सकते हैं, जिसे नोटिफिकेशन सेंटर को भेज दिया जाएगा। उदाहरण के लिए:

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

यहां छवि विवरण दर्ज करें

ध्यान दें कि वर्तमान में एप्लिकेशन आइकन बदलना संभव नहीं है।


1
यदि विशेष रूप से पहले से ही स्थापित हो तो अच्छा दृष्टिकोण।
बेसी

1
मुझे लगता है कि आप --icon path/to/icon.pngआइकन के विकल्प का उपयोग करने में सक्षम हो सकते हैं ।
होगा

पदावनत / अब कायम नहीं है? अंतिम अद्यतन macos 10.9 mavericks के
सीमस

15

मैंने हाल ही में नोटिफिकेशन अलर्ट (क्रियाओं के साथ) और रिप्लाई टाइप अलर्ट प्रदर्शित करने के लिए कमांड लाइन टूल बनाने के लिए टर्मिनल-नोटिफ़ायर का इस्तेमाल किया।

मैं उपयोगकर्ताओं से संवादात्मक उत्तर प्राप्त करने के लिए अपनी शेल स्क्रिप्ट और गोलंग ऐप्स के साथ इसका उपयोग करता हूं।

https://github.com/vjeantet/alerter

यहां छवि विवरण दर्ज करें


1
इसके अलावा स्पष्ट रूप से पदावनत / छोड़ दिया गया।
सीम्यूस

15

@grgarside का समाधान अच्छा है, लेकिन यह स्क्रिप्ट इंजेक्शन के लिए असुरक्षित है, जो एक प्रमुख सुरक्षा समस्या हो सकती है जब इसका उपयोग लॉग फ़ाइल सामग्री या कुछ इसी तरह प्रदर्शित करने के लिए किया जाता है।

यह सुरक्षित होना चाहिए:

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

यह दिलचस्प है, लेकिन क्या आप एक ऐसे परिदृश्य का वर्णन कर सकते हैं, जहां मैं अपने सिस्टम पर चलने वाली स्क्रिप्ट जो केवल उपयोगकर्ता-निष्पादन योग्य है, स्क्रिप्ट इंजेक्शन के लिए असुरक्षित है?
आइकनोकॉस्ट

1
यदि आप उपयोगकर्ता सामग्री प्रदर्शित करते हैं जो आपसे नहीं है, तो आप असुरक्षित हैं। उदाहरण के लिए, यदि आप इसे किसी सार्वजनिक वेब सर्वर के साथ सिस्टम पर चलाते हैं, या जब कुछ ऐप लॉग्स स्ट्रिंग करते हैं तो यह नेट से प्राप्त होता है जिसे आप पढ़ते हैं और प्रदर्शित करते हैं, उदाहरण के लिए ब्राउज़र, मेल प्रोग्राम या ट्विटर क्लाइंट। यह एक "स्ट्रिंग और स्टेटमेंट को समाप्त करने के लिए हो सकता है, फिर कोड होता है और फिर एक स्ट्रिंग को पुनः आरंभ करता है।
आर्किमिडिक्स

ठीक है, यह सच है। वेब फ़ॉर्म से सामग्री को कभी भी मेरी सूचनाओं में डालने की कल्पना करना मेरे लिए कठिन है, लेकिन आपकी बात मान ली गई है।
iconoclast

1
ठीक है, हो सकता है कि आप ऐसा कुछ कहना चाहें, जैसे I have a "laser"बिना बताए आपको "अपने" शब्दों को "उद्धृत" करके एक वाक्यविन्यास त्रुटि हो। भागने के साथ, आप कर सकते हैं:script 'I have a "laser"'
आर्किमिडीज़

1
अपवोट करें क्योंकि सुरक्षा को ध्यान में रखना हमेशा अच्छा होता है। कोई-पास्ता समाधानों की प्रतिलिपि बना सकता है और उनका उपयोग उन तरीकों से कर सकता है जो समाधान पोस्ट करने वाले व्यक्ति ने नहीं माना था।
एडवर्ड फॉक

13

चूंकि ग्रोथ फ्री नहीं है, और प्री -10.8 सिस्टम पर टर्मिनल-नोटिफ़ायर उपलब्ध नहीं है, मैं कोकोआडियल का उपयोग करता हूं । यह मुफ़्त और खुला स्रोत है, इसलिए आप संभवतः अपनी स्क्रिप्ट के साथ भी वितरित कर सकते हैं।

यदि आपको बहुत अधिक अनुकूलन की आवश्यकता नहीं है, तो आप 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"'
माइकस्किंकेल

पदावनत भी किया गया। लिंक पैदावार "यहाँ एक GitHub पृष्ठ साइट नहीं है।"
सीम्यूस

11

(यह @ ग्रामसाइड के उत्कृष्ट उत्तर पर आधारित एक वैकल्पिक कार्यान्वयन है।)

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 पर एक रूबी स्क्रिप्ट में उपयोग करता हूं (ताकि मैं एक स्क्रिप्ट शुरू कर सकूं और खिड़की से दूर टॉगल करने के बाद भी अपडेट प्राप्त कर सकूं):

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

2
वाह ... तो श्रृंखला कुछ इस तरह है उपयोगकर्ता -> रूबी -> शेल -> AppleScript -> उद्देश्य-सी -> विधानसभा> सीपीयू?
आइकनोकॉस्ट

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

दस्तावेज़ को ले जाने या हटाने के मामले में, यहाँ पाठ की प्रतिलिपि बनाना।

एक अधिसूचना दिखाने के लिए, प्रदर्शन अधिसूचना कमांड को प्रदर्शित करने के लिए एक स्ट्रिंग प्रदान करें। वैकल्पिक रूप से, शीर्षक, उपशीर्षक, और ध्वनि नाम मापदंडों के साथ मान प्रदान करें जब सूचना दिखाई दे, तो अतिरिक्त जानकारी और एक श्रव्य चेतावनी प्रदान करें।

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

ध्यान दें

अधिसूचना प्रदर्शित करने के लिए स्क्रिप्ट का उपयोग करने के बाद, स्क्रिप्ट या स्क्रिप्ट संपादक (यदि स्क्रिप्ट संपादक के भीतर से चलाया जाता है) को सिस्टम वरीयताएँ सूचनाओं में सूचित करने वाले ऐप्स की सूची में जोड़ा जाता है। वहां, आप विकल्पों को कॉन्फ़िगर कर सकते हैं, जैसे कि सूचनाओं को अलर्ट या बैनर के रूप में प्रदर्शित करना।

अलर्ट-शैली अधिसूचना में शो बटन पर क्लिक करने से अधिसूचना प्रदर्शित करने वाला ऐप खुल जाता है। एक स्क्रिप्ट ऐप के लिए, ऐप को फिर से खोलने की कार्रवाई स्क्रिप्ट के रन हैंडलर को ट्रिगर करती है, जिससे संभवतः स्क्रिप्ट दूसरी बार प्रसंस्करण शुरू कर सकती है। इसे ध्यान में रखें और यदि उपयुक्त हो तो इस परिदृश्य को संभालने के लिए अपनी स्क्रिप्ट में कोड जोड़ें।


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, $ 4 के लिए पिंग का उपयोग करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.