파일 이름을 전달하여 응용 프로그램에서 창을 어떻게 닫나요?

파일 이름을 전달하여 응용 프로그램에서 창을 어떻게 닫나요?

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는 이제 잘못 서명되어 사용할 수 없습니다. :(

관련 정보