Mac OS X의 Preview 응용 프로그램에 특정 창을 닫도록 지시하는 Applescript 기반 셸 명령을 생성하려고 합니다.
#!/bin/sh
osascript <<EOF
tell application "Preview"
close "$1"
end tell
EOF
하지만 이것은 작동하지 않습니다. 오류 메시지가 나타납니다.
25:52: execution error: Preview got an error: "musixdoc.pdf" doesn’t understand the close message. (-1708)
관련 질문:.bash_profile에 정의된 별칭을 사용하여 명령줄에서 OS X 응용 프로그램을 어떻게 닫나요?
답변1
AppleScript 명령을 허용하도록 Preview.app 가져오기
기본적으로 AppleScripting Preview는 미리보기에 필요한 사전이 없기 때문에 작동하지 않습니다. 이 문제를 해결하려면 다음을 확인하세요.여기에 Lauri의 답변이 있습니다.NSAppleScriptEnabled
, Preview.app의 설정을 설명합니다 .
Preview.app을 종료한 후 터미널을 열고 다음을 입력하세요.
sudo defaults write /Applications/Preview.app/Contents/Info NSAppleScriptEnabled -bool true
sudo chmod 644 /Applications/Preview.app/Contents/Info.plist
sudo codesign -f -s - /Applications/Preview.app
응용 프로그램에서 창 닫기
1) 윈도우 인덱스 또는 윈도우 이름 기준
명명된 응용 프로그램의 창을 닫는 명령은 다음과 같습니다.
tell application "Preview" to close window 1
... 또는 명명된 문서 창을 닫으려는 경우, 예 foo.jpg
:
응용프로그램 "미리보기"에 닫으라고 지시합니다(이름이 "foo.jpg")
따라서 쉘 스크립트에서는 다음과 같습니다.
#!/bin/sh
osascript <<EOF
tell application "Preview"
close (every window whose name is "$1")
end tell
EOF
여기서 스크립트에 전달된 첫 번째 인수는 닫으려는 창의 이름입니다(예: ) ./quit.sh foo.jpg
. 파일에 공백이 포함된 경우 파일 이름을 인용해야 합니다(예: ./quit.sh "foo bar.jpg"
.
또는 임의의 응용프로그램에서 임의의 창을 닫으려면 다음을 사용하십시오.
#!/bin/sh
osascript <<EOF
tell application "$1"
close (every window whose name is "$2")
end tell
EOF
여기서는 ./quit.sh Preview foo.jpg
예를 들어 사용합니다.
2) 파일명별
특정 문서에 속하지만 파일 이름을 제공하는 창을 닫고 싶다면 다른 것이 필요합니다. 이는 여러 페이지로 구성된 PDF가 로 표시될 수 있지만 AppleScript로 foo.pdf (Page 1 of 42)
전달하기를 원하기 때문입니다.foo.pdf
여기서는 창을 반복하고 파일 이름을 스크립트에 전달된 인수와 비교합니다.
osascript <<EOF
tell application "Preview"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$1") then
close window x
end if
end repeat
end tell
EOF
이제 간단히 전화를 걸 수 있습니다 ./quit.sh foo.pdf
. 일반화된 방식으로 명명된 문서 창을 가진 모든 앱의 경우 다음과 같습니다.
osascript <<EOF
tell application "$1"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$2") then
close window x
end if
end repeat
end tell
EOF
주의 사항: Preview.app 자동 종료
Preview.app은 마지막 문서 창이 닫히면 자동으로 종료되는 이러한 응용 프로그램 중 하나입니다. 메모리를 절약하고 "정리"하기 위해 그렇게 합니다. 이 동작을 비활성화하려면 다음을 실행하십시오.
defaults write -g NSDisableAutomaticTermination -bool TRUE
물론, 취소하려면 TRUE
로 변경하세요 FALSE
.
스크립트 대신 함수 사용
마지막으로, 쉘에서 항상 사용할 수 있는 함수에 스크립트를 넣는 것이 좋습니다. 이렇게 하려면 스크립트를 ~/.bash_profile
. 이 파일이 없으면 만듭니다.
cw() {
osascript <<EOF
tell application "$1"
set windowCount to number of windows
repeat with x from 1 to windowCount
set docName to (name of document of window x)
if (docName is equal to "$2") then
close window x
end if
end repeat
end tell
EOF
}
Bash 프로필을 저장하고 셸을 다시 시작하면 cw Preview foo.pdf
어디에서나 호출할 수 있습니다.
답변2
slhck의 답변은 훌륭하고 철저 해 보입니다.주의하세요. 세 번째 코드 줄을 실행하세요.:
sudo codesign -f -s - /Applications/Preview.app
다음과 같은 문제로 인해 실행할 때마다 Preview가 충돌하는 원인인 것 같습니다.
Application Specific Information:
XPC domain creation failed: The code signature is not valid: The operation couldn’t be completed. (OSStatus error -67061.)
공동 설계 매뉴얼에 따르면 -f
'코드 서명을 교체하고 기존 서명을 강제로 적용'하고 -s
'주어진 경로에서 코드에 서명'하는 것입니다. 이 경우-
분명히 Preview는 이제 잘못 서명되어 사용할 수 없습니다. :(