Ejecute AppleScript desde el script bash

55

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

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

¿Qué sucede, sin embargo, si quisiera ejecutar comandos que debían ejecutarse en secuencia desde 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 este es un ejemplo muy descabellado, pero funciona para explicar lo que estoy tratando de hacer. Normalmente, esos comandos se escribirían sin sus respectivos \caracteres de escape en todo el lugar y menos "alrededor de cada comando. También los tendría dentro de un .scptarchivo.

Una solución que conozco es reescribir el script usando en #!/usr/bin/osascriptlugar de bash e ir desde allí, pero quiero poder mezclar. He descubierto que puedo probar un archivo de secuencia de comandos, si existe para crear uno y agregar cada comando que necesito a ese archivo y luego ejecutar el archivo de secuencia de comandos requerido desde bash, pero eso también anula el propósito.

No hay forma de que a la mitad de un archivo, pueda intercambiar el shell que se está utilizando con la shebanglínea y luego volver a cambiar después de haber ejecutado los comandos necesarios, ¿existe?

Cualquier idea sería más que bienvenida.

Danijel-James W
fuente

Respuestas:

57

El argumento para osascript -epuede contener nuevas líneas:

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

También puede especificar múltiples -eargumentos:

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

O si se utiliza un heredoc, bashinterpreta tres personajes ( \, $y `) entre <<ENDy ENDaunque no hay caracteres entre <<'END'y END.

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

Editar:

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

#!/usr/bin/env osascript

set x to "a"
say x

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

Lri
fuente
De hecho tienes razón. Me perdí el primero end telldel guión.
Danijel-James W
¿Alguna razón por la que no necesita el -eejemplo HEREDOC?
iconoclasta
@iconoclast Según la página de manual en 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.
uchuugaka
Lo siento @uchuugaka, pero no entiendo cómo responde tu respuesta a mi pregunta. En -e statement Enter one line of a scriptallí es un -epresente. Pero aparte de eso, ¿se trata un HEREDOC como si fuera una sola línea?
iconoclasta
21

Puede ajustar el AppleScript sin procesar en <<EOD... La última EODseñalización del final de la entrada tiene que venir en la primera posición de la línea.

(Por cierto, su applecript parecía faltar un end telldespués 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"
beroe
fuente