AppleScript 또는 쉘 스크립트에서 알림 센터 알림을 어떻게 트리거 할 수 있습니까?


305

필자는 AppleScript 및 필자가 작성한 쉘 스크립트에서 10.8의 알림 센터 기능을 활용할 수 있기를 바랍니다.

AppleScript 또는 쉘 스크립트에서 사용할 수있는 내장 명령 또는 타사 라이브러리가 있습니까?

이상적으로 알림의 유형과 아이콘을 제어 할 수 있지만 스톡 아이콘 (그러나 사용자 정의 텍스트)이있는 기본 배너를 트리거하는 기능조차도 높이 평가 될 것입니다.


답변:


428

Mavericks 이상에서는 AppleScript의 '디스플레이 알림'을 사용하여이를 수행 할 수 있습니다.

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

                          

문자 그대로 간단합니다! 아니 3 번째의 -party 라이브러리 나 앱이 필요하지 다른 시스템에서 사용하기 위해 완전히 휴대용입니다. 상단에 10.9 알림, 중간에 10.10 DP, 하단에 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 / 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
사용자가 명시 적으로 클릭 할 때까지 알림 팝업이 영구적으로 존재하도록 할 수 있습니까 (N 초 후에 자동 숨기기가 아님)?
Sridhar Ratnakumar

25
신사 숙녀 여러분, 월드 와이드 웹에서 1 시간 동안 조사한 결과, 사용자가 해고 될 때까지 알림 창을 유지하는 방법을 알게되었습니다! 실제로 작성된 스크립트의 일부 매개 변수가 아닌 시스템 환경 설정의 설정에 의해 제어되었습니다. 그것을 모두 설명해야이 두 이미지 i.imgur.com/cNOqFyX.jpg의 i.imgur.com/i8oyoan.jpg은 재미있는 사람이 있고, 덕분에 훌륭한 대답을 @grgarside.
빅 장

4
텍스트는 큰 따옴표로 묶어야합니다. 작은 따옴표는 작동하지 않습니다. 따라서 텍스트에 변수가 "display ... '$mytext' ..."필요한 경우을 쓸 수 없지만 큰 따옴표는 이스케이프해야합니다 "display notification \"$mytext\" ...".
mivk December

93

터미널 알리미

읽어보기에서 :

terminal-notifier는 Mac OS X 10.8에서 사용할 수있는 Mac OS X 사용자 알림을 보내는 명령 줄 도구입니다.

NSUserNotification'Foundation tool'에서 작동하지 않기 때문에 현재 애플리케이션 번들로 패키지되어 있습니다. 레이더 : // 11956694

이 도구는 파일 시스템 변경으로 인해 실행되는 명령의 상태를 표시하기 위해 Kicker 에서 사용됩니다 . (v3.0.0)

다운로드

코드 서명되고 사용할 준비가 된 사전 빌드 된 바이너리는 다운로드 섹션 에서 사용할 수 있습니다 .

용법

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

터미널 알리미를 사용 하려면 앱 번들 에서 바이너리를 호출해야 합니다.

첫 번째 인수는 알림이 속한 '그룹'을 지정합니다. '그룹'의 경우 이전에 게시 된 알림을 대체하여 하나의 알림 만 표시됩니다. 고유 한 프로세스로 알림 범위를 지정하는 송신자의 프로세스 ID 또는 프로젝트 별 알림 범위를 지정하는 현재 작업 디렉토리.

두 번째 및 세 번째 인수는 알림 자체를 설명하며 각각 '제목'과 '메시지'입니다. 예를 들어, 알림을 보낸 사람에게 사용자에게 알리기 위해 보낸 사람의 이름을 제목으로 지정할 수 있습니다.

네 번째 및 마지막 인수는 선택 사항입니다. 사용자가 알림을 클릭 할 때 활성화해야하는 응용 프로그램을 지정합니다. 기본적으로 이것은 다른 응용 프로그램을 시작하기 위해 Terminal.app을 활성화하고 대신 응용 프로그램의 번들 식별자를 지정합니다. 예를 들어 Safari.app을 시작하려면 다음을 사용하십시오 com.apple.Safari.


달콤하고 훌륭한 도서관! 아이콘 및 경고 대 배너를 제어하여 업데이트 된 것을보고 싶지만 확실히 유용합니다. 링크 주셔서 감사합니다! i.imgur.com/tsCeK.png
Nathan Greenstein

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의 답변에 메모를 추가하고 싶습니다.

비교

나는 당신을위한 해결책을 찾았습니다.

실제로 작성된 스크립트의 일부 매개 변수가 아닌 시스템 환경 설정의 설정에 의해 제어되었습니다. 이 두 이미지는 모두 설명해야합니다

훌륭한 답변을 위해 @grgarside에게 감사드립니다.

시스템 환경 설정


5
특정 앱은 다를 수 있습니다. and Script Editor만입니다 . 서비스 워크 플로에서는 입니다. 때 내부 , 그것은이다 . Script Editor.apposascriptAutomator RunnerAutomator.appAutomator
cde

1
배너를 클릭하면 스크립트 편집기 응용 프로그램이 나타납니다. 클릭하면 사라질 수 있기를 원하지만이 게시물에서는 마우스를 가리키고 트랙 패드를 살짝 밀면
Joshua Goldberg

@JoshuaGoldberg 추가해 주셔서 감사합니다! 나는 직관적으로 언젠가 Mac OS X에 대해 좋아하는 한 가지를 발견했다. 그것이 기대하는 방식으로 작동한다는 것을 발견했다 :)
Vic Jang

22

이제 앱 스토어에서 제공되는 Growl2를 사용하여이 작업을 수행 할 수 있습니다 . Growl을 설치하고 "OS X 알림"(스크린 샷)을 활성화하십시오.

여기에 이미지 설명을 입력하십시오

또한 명령 줄 도구로 Growl 알림을 보내려면 GrowlNotify를 설치해야합니다. 이 도구는 다운로드 페이지 에서 무료로 다운로드 할 수 있습니다 .

이제 명령 행에서 Growl 알림을 생성 할 수 있으며이 알림은 알림 센터로 전달됩니다. 예를 들면 다음과 같습니다.

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

여기에 이미지 설명을 입력하십시오

현재는 응용 프로그램 아이콘을 변경할 수 없습니다.


1
으르렁 거리는 소리가 이미 설치되어있는 경우 특히 좋은 방법입니다.
Besi

1
--icon path/to/icon.png아이콘 옵션을 사용할 수 있다고 생각합니다 .

더 이상 사용되지 않거나 더 이상 유지되지 않습니까? 마지막 업데이트는 macos 10.9 mavericks
Seamus

15

최근에 터미널 알림을 분기하여 알림 알림 (작업 포함) 및 응답 유형 알림을 표시하는 명령 줄 도구를 작성했습니다.

쉘 스크립트 및 golang 앱과 함께 사용하여 사용자의 대화 형 답변을 얻습니다.

https://github.com/vjeantet/alerter

여기에 이미지 설명을 입력하십시오


1
또한 더 이상 사용되지 않거나 중단되었습니다.
Seamus

15

@grgarside솔루션 은 훌륭하지만 스크립트 삽입에 취약하여 로그 파일 내용 또는 이와 유사한 것을 표시하는 데 사용될 때 주요 보안 문제가 될 수 있습니다.

이것은 더 안전해야합니다.

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

이것은 흥미롭지 만 사용자가 실행할 수있는 시스템에서 내가 실행하는 스크립트가 스크립트 삽입에 취약한 시나리오를 설명 할 수 있습니까?
iconoclast

1
자신이 아닌 사용자 컨텐츠를 표시하면 취약한 것입니다. 예를 들어 공개 웹 서버가있는 시스템에서 실행하거나 일부 앱이 문자열을 기록 할 때 브라우저, 메일 프로그램 또는 Twitter 클라이언트와 같이 읽고 표시 한 네트워크에서 가져옵니다. "문자열과 문장을 끝내고 코드를 가지고 문자열을 다시 시작하기 위해"를 가질 수 있습니다.
Archimedix

알았어, 사실이야 웹 양식의 내용을 내 알림에 넣는 것을 상상하기가 어렵지만 요점을 알 수 있습니다.
iconoclast

1
글쎄, I have a "laser"당신은 "단어"를 인용하여 구문 오류가 있다고 들리지 않고 같은 것을 말하고 싶을 것 입니다. 탈출하면 다음을 수행 할 수 있습니다.script 'I have a "laser"'
Archimedix

1
보안을 항상 염두에 두는 것이 좋기 때문에 공감하십시오. 누군가는 솔루션을 복사하여 솔루션을 게시하는 사람이 고려하지 않은 방식으로 솔루션을 복사 할 수 있습니다.
Edward Falk

13

Growl은 무료가 아니며 10.8 이전 시스템에서는 터미널 알림을 사용할 수 없으므로 cocoaDialog 를 사용하는 경향이 있습니다 . 무료이며 오픈 소스이므로 스크립트와 함께 배포 할 수도 있습니다.

많은 사용자 화가 필요하지 않은 경우, display notification다른 사람들이 이미 언급했듯이 쉘에서 호출 할 수있는 AppleScript를 사용할 수도 있습니다 .

그러나 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

또한 더 이상 사용되지 않습니다. Link yields "GitHub 페이지 사이트가 없습니다."
Seamus

11

(@grgarside의 훌륭한 답변을 기반으로 한 대체 구현입니다.)

AppleScript는 osascriptshebang 라인을 입력하여 직접 해석 할 수 있습니다 .

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

이렇게하면 다른 모든 답변에 취약한 주입 공격을 피할 수 있습니다.
Neil Mayhew

7

다음은 OS X의 루비 스크립트에서 사용하는 멋진 것입니다 (그래서 창을 토글 한 후에도 스크립트를 시작하고 업데이트 할 수 있습니다).

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

2
와우 ... 그래서 체인은 사용자-> 루비-> 쉘-> 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 및 sound name 매개 변수의 값을 제공하여 알림이 표시 될 때 추가 정보 및 가청 경고를 제공합니다

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에 Ping을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.