78 votos

Ejecutar AppleScript desde bash script

Si quisiera ejecutar un AppleScript desde dentro de un bash script podría llamar a un archivo con la lista de comandos que requiero ejecutar.

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

Sin embargo, ¿qué pasaría si quisiera ejecutar comandos que tuvieran que ser ejecutados en secuencia desde dentro de bash?

Un ejemplo sería

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

Sé que es un ejemplo muy rebuscado, pero sirve para explicar lo que intento hacer. Normalmente, todos esos comandos se escribirían sin su respectivo escape \ personajes por todas partes y menos " alrededor de cada comando. También los tendría dentro de un .scpt archivo.

Una solución que conozco, es reescribir el script utilizando #!/usr/bin/osascript en lugar de bash y partir de ahí, pero quiero ser capaz de mezclar. He encontrado que puedo probar un archivo script, si existe crear uno y anexar cada comando que necesito a ese archivo y luego ejecutar el archivo script requerido desde dentro de bash, pero eso también derrota el propósito.

No hay manera de que a mitad de un archivo, pueda cambiar el shell que se está utilizando con el shebang línea y luego cambiar de nuevo después de haber ejecutado los comandos necesarios, ¿existe?

Cualquier idea será más que bienvenida.

81voto

Fuzzy Purple Monkey Puntos 702

El argumento para osascript -e puede contener nuevas líneas:

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

También puede especificar varios -e argumentos:

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

O si utiliza un heredoc, bash interpreta tres caracteres ( \ , $ y ` ) entre <<END y END pero sin caracteres entre <<'END' y END .

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

Editar:

Dado que osascript puede operar con un heredoc (es decir, tomar la entrada de /dev/stdin) entonces uno puede simplemente escribir el script como un archivo completo y preagregar con la línea shebang correcta:

#!/usr/bin/env osascript

set x to "a"
say x

Esto también le permite guardar su script de la Apple como un programa real en ~/Aplicaciones/.app utilizando el siguiente procedimiento (cambiando por el nombre de su 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>

Asegúrese de que tanto el archivo script en .../MacOS/ como los partidos

0 votos

Efectivamente, tiene razón. Me perdí la primera end tell del script.

0 votos

Cualquier razón por la que no necesite el -e en el ejemplo de HEREDOC?

0 votos

@iconoclast Según la página man de osascript es una línea 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.

35voto

beroe Puntos 1605

Puede envolver el AppleScript en bruto en <<EOD ... El último EOD que señala el final de la entrada, tiene que estar en la primera posición de la línea.

(Por cierto, parece que a tu applescript le falta un end tell después de 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"

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X