Execute o AppleScript a partir do script bash


55

Se eu quisesse executar um AppleScript a partir de um script bash, poderia chamar um arquivo com a lista de comandos que preciso executar.

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

O que, no entanto, se eu quisesse executar comandos que precisassem ser executados em sequência a partir do bash?

Um exemplo seria

#!/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"

Sei que este é um exemplo muito distante, mas funciona para explicar o que estou tentando fazer. Normalmente, esses comandos seriam todos escritos sem os respectivos \caracteres de escape em todo o lugar e menos em "torno de cada comando. Eu também os teria dentro de um .scptarquivo.

Uma solução que eu conheço é reescrever o script usando em #!/usr/bin/osascriptvez do bash e partir daí, mas eu quero poder misturar. Descobri que posso testar um arquivo de script, se ele existir para criar um e anexar cada comando necessário ao arquivo e, em seguida, executar o arquivo de script necessário a partir do bash, mas isso também anula o objetivo.

Não há como, no meio de um arquivo, eu possa trocar o shell que está sendo usado com a shebanglinha e depois voltar depois de executar os comandos necessários, existe?

Qualquer insight seria mais que bem-vindo.

Respostas:


57

O argumento para osascript -epode conter novas linhas:

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

Você também pode especificar vários -eargumentos:

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

Ou se você usar um heredoc, bashinterpreta três personagens ( \, $e `) entre <<ENDe ENDmas não caracteres entre <<'END'e END.

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

Editar:

Como o osascript pode operar com um heredoc (ou seja, receber a entrada de / dev / stdin), basta escrever o script como um arquivo inteiro e adicionar a linha shebang correta:

#!/usr/bin/env osascript

set x to "a"
say x

Isso também permite que você salve o script apple como um programa real em ~ / Applications / .app usando o seguinte procedimento (alterando o nome do script):

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>

Verifique se o arquivo de script em ... / MacOS / e as correspondências


Na verdade você está correto. Eu perdi o primeiro end telldo roteiro.
Danijel-James W

Alguma razão para você não precisar do -eexemplo HEREDOC?
Iconoclasta

@iconoclast Pela página de manual no osascript, é uma linha de script. -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 12/03

Desculpe @uchuugaka, mas não entendo como sua resposta responde à minha pergunta. Em -e statement Enter one line of a scriptnão é um -epresente. Mas, além disso, um HEREDOC é tratado como se fosse uma única linha?
iconoclast

21

Você pode agrupar o AppleScript bruto em <<EOD... A última EODsinalização para o final da entrada deve ocorrer na primeira posição da linha.

(BTW, seu AppleScript parecia estar faltando um end telldepois 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"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.