Làm cách nào tôi có thể kích hoạt thông báo Trung tâm thông báo từ AppleScript hoặc shell script?


305

Tôi rất thích có thể tận dụng các tính năng của Trung tâm thông báo 10.8 trong AppleScripts và các tập lệnh shell tôi viết.

Có một lệnh tích hợp hoặc thư viện của bên thứ ba mà tôi có thể sử dụng từ AppleScript hoặc shell script không?

Lý tưởng nhất là loại và biểu tượng của thông báo có thể được kiểm soát, nhưng ngay cả khả năng kích hoạt biểu ngữ cơ bản với biểu tượng chứng khoán (nhưng văn bản tùy chỉnh) sẽ được đánh giá cao.


Câu trả lời:


428

Với Mavericks trở lên, bạn có thể thực hiện việc này bằng 'thông báo hiển thị' của AppleScript:

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

                          

Đó là nghĩa đen mà đơn giản! Không yêu cầu thư viện hoặc ứng dụng thứ 3 và hoàn toàn có thể mang theo để sử dụng trên các hệ thống khác. Thông báo 10.9 ở phía trên, 10.10 DP ở giữa, 10.10 ở phía dưới.

AppleScript có thể được chạy từ trình bao bằng cách sử dụng / usr / bin / osascript:

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

Bạn cũng có thể tùy chỉnh cảnh báo hơn nữa bằng cách thêm vào

  • một phụ đề

    Nối 'phụ đề' theo sau bởi chuỗi hoặc biến chứa phụ đề.

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

    Ví dụ trên tạo ra thông báo sau:

  • âm thanh

    Nối 'tên âm thanh' theo sau là tên của âm thanh sẽ được phát cùng với thông báo.

    display notification "message" sound name "Sound Name"

    Tên âm thanh hợp lệ là tên của các âm thanh nằm trong bản

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

Thông báo đăng có thể được gói dưới dạng một tập lệnh dòng lệnh. Đoạn mã sau có thể được chạy trong Terminal và sẽ thêm tập lệnh vào / usr / local / bin (phải tồn tại, thêm vào $ PATH) được gọi notify.

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

Đây là kịch bản mà ở trên sẽ thêm để thông báo.

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

Bây giờ để hiển thị một thông báo:

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

9
@ceilingcat Đây là AppleScript. Để chạy nó trong Terminal, sử dụng osascript (xem câu trả lời).
grg

8
Vấn đề duy nhất display notificationlà khi bạn nhấp vào nó, hộp thoại mở tệp xuất hiện.
ɹoƃI

7
Có thể làm cho cửa sổ bật lên đáng chú ý tồn tại mãi mãi (không tự động ẩn sau N giây) cho đến khi người dùng nhấp vào rõ ràng?
Sridhar Ratnakumar

25
Thưa quý vị, sau một giờ điều tra trên mạng toàn cầu, tôi đã tìm ra cách để cửa sổ thông báo ở lại cho đến khi bị người dùng gạt bỏ! Nó thực sự được kiểm soát bởi một cài đặt trong System Preference, thay vì một số tham số trong tập lệnh được viết. Hai hình ảnh này sẽ giải thích tất cả i.imgur.com/cNOqFyX.jpg i.imgur.com/i8oyoan.jpg Chúc các bạn vui vẻ, và cảm ơn @grgarside vì câu trả lời tuyệt vời.
Vic Jang

4
Lưu ý rằng văn bản phải được trích dẫn kép. Dấu ngoặc đơn không hoạt động. Vì vậy, nếu bạn cần một biến trong văn bản, bạn không thể viết "display ... '$mytext' ...", nhưng cần thoát dấu ngoặc kép : "display notification \"$mytext\" ...".
mivk

93

thiết bị đầu cuối

Từ README:

trình thông báo đầu cuối là một công cụ dòng lệnh để gửi Thông báo người dùng Mac OS X, có sẵn trong Mac OS X 10.8.

Nó hiện được đóng gói dưới dạng gói ứng dụng, vì NSUserNotificationkhông hoạt động từ 'Công cụ Foundation'. radar: // 11956694

Công cụ này sẽ được Kicker sử dụng để hiển thị trạng thái của các lệnh được thực thi do thay đổi hệ thống tệp. (v3.0.0)

Tải xuống

Các tệp nhị phân dựng sẵn, được ký mã và sẵn sàng để sử dụng, có sẵn từ phần tải xuống .

Sử dụng

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

Để sử dụng trình thông báo đầu cuối, bạn phải gọi tệp nhị phân bên trong gói ứng dụng.

Đối số đầu tiên chỉ định 'nhóm' một thông báo thuộc về. Đối với bất kỳ 'nhóm' nào, chỉ có một thông báo sẽ được hiển thị, thay thế các thông báo đã đăng trước đó. Ví dụ là: ID tiến trình của người gửi để phạm vi thông báo theo một quy trình duy nhất hoặc thư mục làm việc hiện tại để phạm vi thông báo theo dự án.

Đối số thứ hai và thứ ba mô tả chính thông báo và lần lượt là 'tiêu đề' và 'thông điệp'. Ví dụ: để liên lạc với người gửi thông báo cho người dùng, bạn có thể chỉ định tên người gửi làm tiêu đề.

Đối số thứ tư và cuối cùng là một tùy chọn. Nó chỉ định ứng dụng nào sẽ được kích hoạt khi người dùng nhấp vào thông báo. Theo mặc định, điều này sẽ kích hoạt Terminal.app, để khởi chạy một ứng dụng khác thay vì chỉ định định danh gói của ứng dụng. Ví dụ: để khởi chạy Safari.app, hãy sử dụng : com.apple.Safari.


Ngọt ngào, một thư viện tuyệt vời! Rất thích nhìn thấy nó được cập nhật với quyền kiểm soát biểu tượng và cảnh báo so với biểu ngữ, nhưng chắc chắn hữu ích. Cảm ơn các liên kết! i.imgur.com/tsCeK.png
Nathan Greenstein

2
Ứng dụng nhỏ tuyệt vời, tôi đã tạo một trình khởi chạy và đặt / usr / local / bin để tôi có thể sử dụng nó ở bất cứ đâu từ thiết bị đầu cuối, v.v. MacOS ./terminal-notifier $ *
johanandren

4
Trình khởi chạy rất hữu ích, nếu bạn thay đổi một chút, nó hoạt động với văn bản được trích dẫn có dấu cách: #! / Bin / bash cd /Appluggest/terminal-notifier.app/Contents/MacOS ./terminal-notifier "$ @"
Redbeard

27

Tôi chỉ muốn thêm một ghi chú vào câu trả lời của @ grgarside, bởi vì tôi biết nhiều người muốn có một cửa sổ bật lên thông báo chỉ có thể được loại bỏ bằng cách nhấp vào nút.

So sánh

Tôi đã tìm thấy giải pháp cho bạn:

Nó thực sự được kiểm soát bởi một cài đặt trong System Preference, thay vì một số tham số trong tập lệnh được viết. Hai hình ảnh này sẽ giải thích tất cả

Cảm ơn @grgarside cho câu trả lời tuyệt vời.

Ưu tiên hệ thống


5
Lưu ý rằng các ứng dụng cụ thể sẽ thay đổi. Script Editorchỉ dành cho Script Editor.apposascript. Trong một quy trình dịch vụ, đó là Automator Runner. Khi bên trong Automator.app, nó Automator.
cde

1
Tôi thấy khó chịu vì nếu tôi nhấp vào Biểu ngữ, nó sẽ hiển thị ứng dụng Script Editor. Tôi muốn cho nó biến mất trên nhấp chuột, nhưng bài này chỉ ra bạn có thể di chuột qua nó và trackpad-Vuốt sang phải để làm cho nó biến mất lặng lẽ: osxdaily.com/2012/09/05/...
Joshua Goldberg

@JoshuaGoldberg Cảm ơn bạn đã thêm nó! Một ngày nào đó tôi đã phát hiện ra điều đó bằng trực giác, đó là một điều tôi thích ở Mac OS X, nó hoạt động theo cách bạn mong đợi nó hoạt động :)
Vic Jang

22

Bây giờ bạn có thể làm điều này với Growl2 ( có sẵn từ App Store ). Cài đặt Growl và bật "Thông báo OS X" (ảnh chụp màn hình)

nhập mô tả hình ảnh ở đây

Ngoài ra, bạn sẽ cần cài đặt GrowlNotify cho công cụ dòng lệnh để gửi thông báo Growl. Bạn có thể tải xuống công cụ này miễn phí trên trang Tải xuống .

Bây giờ bạn có thể tạo thông báo Growl từ dòng lệnh, sẽ được chuyển tiếp đến Trung tâm thông báo. Ví dụ:

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

nhập mô tả hình ảnh ở đây

Lưu ý rằng hiện tại dường như không thể thay đổi biểu tượng ứng dụng.


1
Cách tiếp cận tốt đẹp đặc biệt là nếu gầm gừ đã được cài đặt.
Besi

1
Tôi nghĩ rằng bạn có thể có thể sử dụng tùy chọn --icon path/to/icon.pngcho các biểu tượng.
Sẽ

Không dùng nữa / không còn duy trì? Bản cập nhật cuối cùng dành cho macos 10.9 mavericks
Seamus

15

Gần đây tôi đã rẽ nhánh trình thông báo đầu cuối để xây dựng một công cụ dòng lệnh để hiển thị Cảnh báo thông báo (có hành động) và Cảnh báo loại trả lời.

Tôi sử dụng nó với các kịch bản shell và ứng dụng golang của mình để nhận câu trả lời tương tác từ người dùng.

https://github.com/vjeteet/alerter

nhập mô tả hình ảnh ở đây


1
Rõ ràng là không dùng nữa / bị bỏ rơi.
Seamus

15

Giải pháp của @grgarside là tốt, nhưng nó dễ bị tiêm script, đây có thể là một vấn đề bảo mật lớn khi điều này được sử dụng để hiển thị nội dung tệp nhật ký hoặc một cái gì đó tương tự.

Điều này sẽ an toàn hơn:

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

Điều này thật thú vị, nhưng bạn có thể mô tả một kịch bản trong đó một tập lệnh tôi chạy trên hệ thống của tôi chỉ có thể thực thi được bởi người dùng dễ bị tấn công bởi tập lệnh không?
iconoclast

1
Nếu bạn hiển thị nội dung người dùng không phải từ bạn, bạn sẽ dễ bị tổn thương. Ví dụ: nếu bạn chạy ứng dụng này trên hệ thống với máy chủ web công cộng hoặc khi một số ứng dụng ghi lại chuỗi mà nó nhận được từ mạng mà bạn đọc và hiển thị, ví dụ: trình duyệt, chương trình thư hoặc máy khách Twitter. Nó có thể có "kết thúc chuỗi và câu lệnh, sau đó có mã và sau đó khởi động lại chuỗi.
Archimedix

được thôi, điều đó đúng thật khó để tôi có thể tưởng tượng việc đưa nội dung từ các biểu mẫu web vào thông báo của tôi, nhưng quan điểm của bạn đã được thực hiện.
iconoclast

1
Chà, có lẽ bạn chỉ muốn nói điều gì đó giống như I have a "laser"không được thông báo rằng bạn đang gặp lỗi cú pháp bằng cách "trích dẫn" "từ" của bạn. Với việc trốn thoát, bạn có thể:script 'I have a "laser"'
Archimedix

1
Upvote bởi vì nó luôn luôn tốt để giữ an ninh trong tâm trí. Ai đó có thể sao chép các giải pháp mì ống và sử dụng chúng theo cách mà người đăng giải pháp đã xem xét.
Edward Falk

13

Vì Growl không miễn phí và trình thông báo đầu cuối không khả dụng trên các hệ thống trước 10.8, tôi có xu hướng sử dụng cacaoDialog . Nó là nguồn mở và miễn phí, vì vậy bạn có thể cũng có thể phân phối cùng với các tập lệnh của mình.

Nếu bạn không cần nhiều tùy chỉnh, bạn cũng có thể sử dụng AppleScript display notificationmà bạn cũng có thể gọi từ trình bao như những người khác đã đề cập.

Nhưng hãy cẩn thận rằng AppleScript dường như yêu cầu báo giá kép. Vì vậy, nếu bạn cần các biến, điều này sẽ không hoạt động :

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

Bạn sẽ phải sử dụng dấu ngoặc kép thoát. Điều này là xấu xí nhưng hoạt động :

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

Điều này cũng hoạt động:osascript -e 'display notification "Lorem ipsum dolor sit amet" with title "Title"'
MikeSchinkel

Cũng không tán thành. Liên kết mang lại "Không có trang GitHub Pages ở đây."
Seamus

11

(Đây là một triển khai thay thế dựa trên câu trả lời tuyệt vời của @ grgarside.)

AppleScript có thể được giải thích trực tiếp bằng cách đặt osascriptdòng 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

Lưu cái này như notifymột nơi nào đó trong đường dẫn của bạn, ví dụ /usr/local/bin/notify, và làm cho nó có thể thực thi được ( chmod +x notify). Nó chấp nhận một tin nhắn và một tiêu đề tùy chọn. Nếu một trong hai có khoảng trắng, hãy bọc nó trong dấu ngoặc kép để shell diễn giải nó thành một đối số duy nhất.

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

Điều này tránh được các cuộc tấn công tiêm chích mà tất cả các câu trả lời khác đều dễ bị tổn thương
Neil Mayhew

7

Đây là một kịch bản hay mà tôi sử dụng trong tập lệnh ruby ​​trên OS X (để tôi có thể bắt đầu tập lệnh và nhận được bản cập nhật ngay cả sau khi bật ra khỏi cửa sổ):

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

2
wow ... vậy chuỗi có gì đó giống như Người dùng -> Ruby -> Shell -> AppleScript -> Objective-C -> Hội -> CPU?
iconoclast

5

Một thay thế:

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

Sử dụng lệnh: sys-notify "title" "message"


5

Tài liệu chính thức

https://developer.apple.com/lvern/content/documentation/LacularUtilities/Conceptual/MacAutomationScriptingGuide/DisplayNotutions.html

Sao chép văn bản ở đây, trong trường hợp tài liệu được di chuyển hoặc gỡ bỏ.

Để hiển thị thông báo, cung cấp lệnh thông báo hiển thị với một chuỗi để hiển thị. Tùy chọn, cung cấp các giá trị cho các tham số với tiêu đề, phụ đề và tên âm thanh để cung cấp thêm thông tin và cảnh báo bằng âm thanh khi thông báo xuất hiện

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

GHI CHÚ

Sau khi sử dụng tập lệnh để hiển thị thông báo, tập lệnh hoặc Trình chỉnh sửa tập lệnh (nếu tập lệnh được chạy từ bên trong Trình chỉnh sửa tập lệnh) sẽ được thêm vào danh sách các ứng dụng thông báo trong Tùy chọn hệ thống> Thông báo. Ở đó, bạn có thể định cấu hình các tùy chọn, chẳng hạn như có hiển thị thông báo dưới dạng cảnh báo hoặc biểu ngữ hay không.

Nhấp vào nút Hiển thị trong thông báo kiểu cảnh báo sẽ mở ứng dụng hiển thị thông báo. Đối với một ứng dụng tập lệnh, hành động mở lại ứng dụng sẽ kích hoạt trình xử lý chạy tập lệnh, có khả năng khiến tập lệnh bắt đầu xử lý lần thứ hai. Hãy ghi nhớ điều này và thêm mã vào tập lệnh của bạn để xử lý tình huống này, nếu phù hợp.


1

Cảm ơn bạn, đây chỉ là những gì tôi cần cho một số tập lệnh người dùng. Tôi đã thực hiện một sửa đổi nhỏ để thêm phụ đề và âm thanh. Nếu một giá trị không được cung cấp, nó sẽ bị bỏ qua.

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"

Đối với âm thanh, sử dụng tên tệp âm thanh mà không có phần mở rộng từ / Hệ thống / Thư viện / Âm thanh. Ví dụ: để sử dụng tệp Ping.aiff, hãy sử dụng Ping với giá 4 đô la

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.