Запустіть AppleScript з bash script


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рядком, а потім поміняти місцями назад після того, як я виконав необхідні команди, чи є?

Будь-яке розуміння було б більш ніж вітальним.

Відповіді:


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

Це також дозволяє зберегти ваш яблучний сценарій як фактичну програму в ~ / 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

Будь-яка причина, яка вам не потрібна -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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.