Запустите AppleScript из скрипта bash

55

Если бы я хотел запустить AppleScript из скрипта bash, я мог бы вызвать файл со списком команд, которые мне нужно выполнить.

#!/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строкой, а затем вернуться обратно после того, как я выполнил необходимые команды, не так ли?

Любое понимание будет более чем приветствоваться.

Даниэль-Джеймс W
источник

Ответы:

57

Аргумент для osascript -eможет содержать символы новой строки:

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

Вы также можете указать несколько -eаргументов:

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

Или , если вы используете Heredoc, bashинтерпретирует три символа ( \, $и `) между <<ENDи , ENDно не символы между <<'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

Это также позволяет вам сохранить ваш Apple-скрипт как актуальную программу в ~ / 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 / и совпадения

LRI
источник
На самом деле вы правы. Я пропустил первый end tellсценарий.
Даниэль-Джеймс W
По какой-то причине вам не нужен -eпример HEREDOC?
иконоборчество
@iconoclast Для man-страницы 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, но я не понимаю, как ваш ответ отвечает на мой вопрос. В -e statement Enter one line of a scriptесть это-e присутствует. Но кроме этого, рассматривается ли HEREDOC, как если бы это была одна строка?
иконоборчество
21

Вы можете обернуть необработанный AppleScript в <<EOD... Последний EODсигнал о конце ввода должен находиться на первой позиции в строке.

(Кстати, ваш яблочный скрипт, похоже, пропустил 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"
берый
источник