Ejecutar AppleScript desde un script bash

48

Si quisiera ejecutar un AppleScript desde un script de bash, podría llamar a un archivo con la lista de comandos que necesito 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 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 este es un ejemplo muy descabellado, pero funciona para explicar lo que estoy tratando de hacer. Normalmente, todos los 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 archivo .scpt .

Una solución que conozco es reescribir la secuencia de comandos utilizando #!/usr/bin/osascript en lugar de bash y continuar desde allí, pero quiero poder combinar. Descubrí que puedo probar un archivo de script, si existe para crear uno y agregar cada comando que necesito a ese archivo y luego ejecutar el archivo de script requerido desde bash, pero eso también anula el propósito.

No hay forma de que a mitad de camino a través de un archivo, puedo intercambiar el shell que se está usando con la línea shebang y luego volver a intercambiar después de ejecutar los comandos necesarios, ¿verdad?

Cualquier información sería más que bienvenida.

    
pregunta Danijel-James W 28.09.2013 - 18:57

2 respuestas

48

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

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

También puede especificar varios argumentos -e :

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

O si usa un heredoc, bash interpreta tres caracteres ( \ , $ y ' ) entre <<END y END pero no hay 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 información de / dev / stdin), uno puede escribir el script como un archivo completo y añadirlo con la línea de 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 ~ / Applications / .app usando el siguiente procedimiento (cambio para 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

    
respondido por el user495470 28.09.2013 - 22:09
19

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

(BTW, parece que a tu manzana 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"
    
respondido por el beroe 28.09.2013 - 20:52

Lea otras preguntas en las etiquetas