macos - programas - Combinando variables en Bash para formar un comando enviado a AppleScript usando el comando osascript
scripts bash ejemplos (2)
Estoy tratando de hacer que este script funcione. Es un script Bash que debe tomar algunas variables, juntarlas y usar el resultado para enviar un comando AppleScript . to_osa
manualmente la cadena repetida desde la variable to_osa
detrás de osascript -e
a la terminal funciona como quiero y espero que lo osascript -e
. Pero cuando intento combinar el comando osascript -e
y la cadena to_osa
, no funciona. ¿Cómo puedo hacer que esto funcione?
the_url="/"http://stackoverflow.com/questions/1521462/looping-through-the-content-of-a-file-in-bash/""
the_script=''tell application "Safari" to set the URL of the front document to ''
delimiter="''"
to_osa=${delimiter}${the_script}${the_url}${delimiter}
echo ${to_osa}
osascript -e ${to_osa}
Además de trabajar de forma manual, el script también funciona cuando escribo el comando deseado en un script y luego lo ejecuto:
echo "osascript -e" $to_osa > ~/Desktop/outputfile.sh
sh ~/Desktop/outputfile.sh
El código ejecutable de triturado de cadenas es propenso a errores y malvado, y no hay absolutamente ninguna necesidad aquí. Es trivial pasar argumentos a un AppleScript definiendo un manejador explícito de ''ejecución'':
on run argv -- argv is a list of strings
-- do stuff here
end run
que luego invocas así:
osascript -e /path/to/script arg1 arg2 ...
Por cierto, si tu script requiere un número fijo de argumentos, también lo escribes así:
on run {arg1, arg2, ...} -- each arg is a string
-- do stuff here
end run
...
Yendo más lejos, incluso puedes hacer que el AppleScript sea ejecutable directamente como lo harías con cualquier otro script de shell. Primero, agregue un hashbang de la siguiente manera:
#!/usr/bin/osascript
on run argv
-- do stuff here
end run
a continuación, guárdelo en formato de texto sin formato sin formato y ejecute chmod +x /path/to/myscript
para que el archivo sea ejecutable. Luego puede ejecutarlo desde el shell de la siguiente manera:
/path/to/myscript arg1 arg2 ...
O bien, si no desea especificar la ruta completa cada vez, coloque el archivo en /usr/local/bin
o en algún otro directorio que esté en la RUTA de su shell:
myscript arg1 arg2 ...
...
Así que aquí está cómo debería escribir su script original:
#!/bin/sh
the_url="http://.com/questions/1521462/looping-through-the-content-of-a-file-in-bash"
osascript -e ''on run {theURL}'' -e ''tell application "Safari" to set URL of document 1 to theURL'' -e ''end run'' $the_url
Rápido, simple y muy robusto.
-
ps Si prefiere abrir una URL en una ventana nueva en lugar de una existente, consulte la página de manual de la herramienta open
OS X.
Como regla general, no ponga comillas dobles en la variable, póngalas alrededor de la variable. En este caso, es más complicado, ya que tiene algunas comillas dobles para las comillas a nivel de bash, y algunas para las comillas a nivel de AppleScript; en este caso, las comillas a nivel de AppleScript van en la variable, las citas de nivel de bash van alrededor de la variable:
the_url="/"http://.com/questions/1521462/looping-through-the-content-of-a-file-in-bash/""
the_script=''tell application "Safari" to set the URL of the front document to ''
osascript -e "${the_script}${the_url}"
Por cierto, usar echo
para verificar cosas como esta es muy engañoso. echo
te dice qué hay en la variable, no qué se ejecutará cuando hagas referencia a la variable en una línea de comando. La mayor diferencia es que echo
imprime sus argumentos después de haber pasado por el análisis de bash (eliminación de comillas y escape, etc.), pero cuando dices "Pegar manualmente la cadena ... funciona" estás diciendo que es lo que quieres antes de analizar . Si las comillas están ahí en la cadena repetida, eso significa que bash no las reconoció como citas y las elimina. Comparar:
string=''"quoted string"''
echo $string # prints the string with double-quotes around it because bash doesnt''t recognize them in a variable
echo "quoted string" # prints *without* quotes because bash recognizes and removes them