Si quisiera ejecutar un AppleScript desde un script bash, podría llamar a un archivo con la lista de comandos que necesito ejecutar.
#!/bin/bash
{some commands}
osascript file.scpt
{other commands}
Sin embargo, ¿qué pasaría si quisiera ejecutar comandos que debían ejecutarse en secuencia desde dentro de bash?
un ejemplo 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"
Sé que este es un ejemplo muy descabellado, pero funciona para explicar lo que estoy tratando de hacer. Normalmente, todos esos comandos se escribirían sin sus respectivos \
caracteres de escape 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 usando #!/usr/bin/osascript
en lugar de bash e ir desde allí, pero quiero poder mezclar. Descubrí 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 dentro de 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 usa con la shebang
línea y luego volver a intercambiar después de haber ejecutado los comandos necesarios, ¿verdad?
Cualquier idea sería más que bienvenida.
El argumento para osascript -e
puede contener saltos de línea:
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 usa un heredoc, bash
interpreta tres caracteres ( \
, $
y `
) entre <<END
y END
pero ningún carácter 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 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 secuencia de comandos de Apple como un programa real en ~/Aplicaciones/.app usando el siguiente procedimiento (cambiando el nombre de su secuencia de comandos):
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
Puede envolver el AppleScript sin formato en <<EOD
... El último EOD
, que indica el final de la entrada, tiene que estar en la primera posición de la línea.
(Por cierto, a tu applescript parecía faltarle un end tell
despué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"
Daniel-James W.
end tell
del guión.iconoclasta
-e
ejemplo de HEREDOC?uchuugaka
-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.
iconoclasta
-e statement Enter one line of a script
hay un presente-e
. Pero aparte de eso, ¿se trata un HEREDOC como si fuera una sola línea?ocodó
|
canalizar un comando, entonces puedeHEREDOC
hacerlo, ya que ambos métodos se comunican con el comando a través destdin
. Esto también significa que puede usar el comando como un shebang , por ejemplo/usr/bin/osascript
. (Que también usa stdin para enviar información al proceso). Intenteecho "set Volume 2" | osascript
una prueba rápida.