bash 스크립트에서 AppleScript 실행


55

bash 스크립트 내에서 AppleScript를 실행하려면 실행 해야하는 명령 목록으로 파일을 호출 할 수 있습니다.

#!/bin/bash
{some commands}
osascript file.scpt
{other commands}

그러나 bash 내에서 순차적으로 실행 해야하는 명령을 실행하려면 어떻게해야합니까?

예를 들면

#!/bin/bash
echo
echo This will open Google Chrome in Kiosk mode
  osascript -e "tell application \"Google Chrome\""
  osascript -e "activate"
  osascript -e     "tell application \"System Events\""
  osascript -e         "key down {command}"
  osascript -e         "key down {shift}"
  osascript -e         "keystroke \"f\""
  osascript -e         "key up {shift}"
  osascript -e         "key up {command}"
  osascript -e     "end tell"
echo "Google Chrome is now open in Kiosk Mode"

나는 이것이 매우 널리 퍼진 예라는 것을 알고 있지만, 내가하려는 일을 설명하는 데 효과적입니다. 일반적으로 이러한 명령은 각 명령마다 각기 이스케이프 \문자 없이 작성됩니다 ". 나는 또한 그것들을 .scpt파일 안에 넣을 것이다 .

내가 아는 해결책 #!/usr/bin/osascript은 bash 대신 사용하여 스크립트를 다시 작성하고 거기에서 나가는 것이지만 혼합 할 수 있기를 원합니다. 스크립트 파일을 테스트하고 해당 파일에 필요한 각 명령을 추가 한 다음 bash 내에서 필요한 스크립트 파일을 실행하는 경우 스크립트 파일을 테스트 할 수 있다는 것을 알았습니다.

파일 중간에 방법을 사용할 수 없으며 shebang줄과 함께 사용중인 쉘 을 교체 한 다음 필요한 명령을 실행 한 후 다시 바꿀 수 있습니까?

모든 통찰력은 환영 이상의 것입니다.

답변:


57

에 대한 인수 osascript -e는 개행을 포함 할 수 있습니다.

osascript -e 'set x to "a"
say x'

여러 -e인수를 지정할 수도 있습니다 .

osascript -e 'set x to "a"' -e 'say x'

당신은 히어 닥을 사용하는 경우 또는 bash(세 개의 문자 해석 \, $`) 사이 <<ENDEND사이에 있지만 문자 <<'END'END.

osascript <<'END'
set x to "a"
say x
END

편집하다:

osascript는 heredoc (예 : / dev / stdin에서 입력)으로 작동 할 수 있으므로 스크립트를 전체 파일로 작성하고 올바른 shebang 행을 앞에 추가 할 수 있습니다.

#!/usr/bin/env osascript

set x to "a"
say x

또한 다음 절차를 사용하여 애플 스크립트를 ~ / Applications / .app에 실제 프로그램으로 저장할 수 있습니다 (스크립트 이름 변경).

mkdir -p ~/Applications/<APP_NAME>.app/Contents/MacOS
touch ~/Applications/<APP_NAME>.app/Contents/MacOS/<APP_NAME>
open -A TextEdit ~/Applications/<APP_NAME>.app/Contents/MacOS/<APP_NAME>

... / MacOS /의 스크립트 파일과 일치하는 파일이 있는지 확인하십시오.


실제로 당신은 맞습니다. 나는 첫 번째 end tell대본을 놓쳤다 .
Danijel-James W

-eHEREDOC 예제 가 필요없는 이유는 무엇입니까?
iconoclast

@iconoclast osascript의 매뉴얼 페이지에 따르면 한 줄의 스크립트입니다. -e statement Enter one line of a script. If -e is given, osascript will not look for a filename in the argument list. Multiple -e options may be given to build up a multi-line script. Because most scripts use characters that are special to many shell programs (for example, AppleScript uses single and double quote marks, ``('', ``)'', and ``*''), the statement will have to be correctly quoted and escaped to get it past the shell intact.
uchuugaka

@uchuugaka 미안하지만 귀하의 답변이 내 질문에 어떻게 대답하는지 이해하지 못했습니다. 에서는 -e statement Enter one line of a script이다-e 본. 그러나 그 외에도 HEREDOC은 마치 한 줄로 취급됩니까?
iconoclast

21

원시 AppleScript를 다음과 같이 감쌀 수 있습니다. 입력 <<EOD의 마지막 EOD신호는 라인의 첫 번째 위치에 있어야합니다.

(BTW, 귀하의 사과가 end tell나중에 누락 된 것 같습니다 activate....)

#!/bin/bash
osascript <<EOD
  tell application "Google Chrome"
      activate
  end tell
  tell application "System Events"
      key down {command}
      key down {shift}
      keystroke "f"
      key up {shift}
      key up {command}
  end tell
EOD

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