2010-08-17 12 views
5

Tengo el siguiente guiónCómo pasar una variable FROM applescript A un script de shell?

#!/bin/bash 
/usr/bin/osascript << EOT 
set myfile to choose file 
EOT 

no_ext=$(python -c "print '$myfile'.split('.')[0]") 

### this works - just need to know how to pass the arg 
R CMD Sweave no_ext.Rnw 
pdflatex no_ext.tex 
open no_ext.pdf 

Puede alguien me punto a "cómo pasar la variable mi_archivo correctamente"?

EDIT ¡Gracias por todas las sugerencias!

No sé qué aceptar, todas sus respuestas realmente me ayudaron porque aprendí mucho de todos.

+0

¿Por qué no escribir todo en bash o bien applescript? ¿por qué esta complejidad? – ghostdog74

+0

Simplemente porque no tengo idea de cómo usar una ventana de ventana de GUI y obtener su argumento (archivo seleccionado) de nuevo en mi script de shell, sin usar el script de Apple. He leído sobre Cocoadialog, pero necesitaría herramientas adicionales para instalar, lo que no funciona para mí, porque los compañeros de trabajo también deberían poder usarlo. –

Respuesta

5

Los siguientes problemas existen en su secuencia de comandos:

Un conjunto variable en la sección de AppleScript llega a ser definido en la secuencia de comandos shell envolvente. Tienes que hacer el intercambio de datos con el script de shell usando la sustitución de comandos.

Los AppleScripts invocados desde un script de shell no pueden interactuar con el usuario porque no tienen un contexto de aplicación. Puede usar la aplicación auxiliar "AppleScript Runner" para ejecutar los comandos de interacción del usuario.

Aquí es una versión revisada de su script, donde se fijan esos problemas:

#!/bin/bash 

myfile=$(/usr/bin/osascript << EOT 
tell app "AppleScript Runner" 
    activate 
    return posix path of (choose file) 
end 
EOT) 

if [ $? -eq 0 ] 
then 
    echo $myfile 
else 
    echo "User canceled" 
fi 
+0

+1 por el razonamiento. aunque ya había pirateado mi camino alrededor de esto, usando: mkdir -p foo.app/Contents/MacOS mv foo.sh foo.app/Contents/MacOS/foo chmod + x foo.app/Contents/MacOS/foo –

+0

Lo siento, ¿puedes explicar el $? -eq 0 si cláusula? ¡Gracias! –

+0

acepté esta porque era la más cercana a la que usé al final –

2

En primer lugar, debe obtener el contenido de la variable myfile de Applescript a bash. No conozco Applescript, así que haré una toma en la oscuridad sobre cómo escribir en su salida estándar. Entonces, la parte de python es solo una complejidad innecesaria (y probablemente sea incorrecta de todos modos, estabas descartando todo después del primer . en lugar del último). Luego necesita un $ antes del nombre de la variable en la sintaxis de bash. Creo que el siguiente script hace lo que quiere: (. set -e al principio hace que la salida de la cáscara de inmediato si se produce un error, en lugar de intentar ejecutar pdflatex a pesar de que no hay ningún archivo .tex se ha producido o algo por el estilo)

#!/bin/sh 
set -e 
myfile=$(osascript <<EOT 
set myfile to choose file 
write myfile to stdout 
EOT 
) 
no_ext="${myfile%.*}" 
R CMD Sweave "$no_ext.Rnw" 
pdflatex "$no_ext.tex" 
open "$no_ext.pdf" 

+0

Eso no funciona, simplemente porque el script que abre el cuadro de diálogo no se ejecuta. Lo necesito para seleccionar el archivo –

+0

@ ran2: El script de shell que he escrito invoca 'oascript', pero el bit de Applescript puede estar equivocado ya que no conozco Applescript. ¿Qué ves si reemplazas 'set -e' por' set -ex' (esto hace que el shell imprima un seguimiento de ejecución)? – Gilles

+0

dice: ++ oascript ./test2: línea 7: oascript: comando no encontrado + miarchivo = –

2

Date cuenta de que las rutas de applescript están delimitadas por dos puntos ":". Necesitas una barra delimitada en bash, así que en términos AppleScript es la "ruta de posix". Además, al usar osascript no puede abrir ventanas de diálogo. Debe decirle a una aplicación que abra la ventana. Luego, "devuelve" algo del AppleScript ... eso es lo que va a bash. Finalmente, en bash para ejecutar un comando y asignar el resultado a una variable, use `` alrededor del comando. Entonces, sabiendo esto, aquí hay un script de shell para usar un AppleScript para obtener la variable myFile.

#!/bin/bash 

myFile=`/usr/bin/osascript << EOT 
tell application "Finder" 
activate 
set myfile to choose file with prompt "Select the file to use in bash!" 
end tell 
return (posix path of myfile) 
EOT` 

echo $myFile 
+0

Esto también me funciona porque he eludido el problema mencionado en el sakra (ver comentario) –

Cuestiones relacionadas