3 votos

Cómo devolver el estado de error a bash desde osascript

Dentro de un bash script, estoy cerrando la ventana frontal de cualquier aplicación que esté en primer plano. Me gustaría saber si el comando falló (cuando la aplicación en primer plano no tienen una ventana frontal. Lo he intentado, pero aunque se oye el pitido de aviso indicando que el cmd-W ha fallado, el script siempre imprime "Command Succeeded". ¿Cuál es la forma fácil de detectar que no hay ventana frontal?

 osascript -e 'tell application "System Events" to keystroke "w" 
    using {command down}'
 if [ $? -eq 0 ]  ; then
     printf "Command succeeded\n"
 else
     printf "command failed\n"
 fi

2voto

red_menace Puntos 111

Como se ha mencionado, el resultado de osascript no es el mismo que el resultado del script . Lo que hago es utilizar el -so para imprimir también los errores en stdout, entonces utilice el código de salida de osascript para determinar cómo tratar el resultado:

osascript -s o -e 'error number -128'

dará un error y también devolverá un mensaje/número de error del script - User canceled. (-128) , mientras que

osascript -s o -e 'tell application "System Events" to keystroke space'

sale normalmente y no genera un error.

Hay que ser más específico a la hora de generar errores, por ejemplo, tratar de conseguir la ventana frontal, que se generar un error si no lo hay.

1voto

wch1zpink Puntos 11

Aquí hay un enfoque un poco diferente que no utiliza los Eventos del Sistema. El siguiente código AppleScript obtendrá el nombre de la aplicación más cercana, entonces esa aplicación comprobará si tiene alguna ventana abierta. Si esa aplicación tiene una ventana abierta, se cerrará. También, por ejemplo, si la aplicación frontal tiene un documento sin guardar como ventana 1, y quiere que se le pida que guarde ese documento, simplemente elimine la parte "sin guardar" del comando.

A mí me funciona con la última versión de macOS Mojave.

delay 5 -- GIVES TIME TO TEMPORARILY SET FOCUS ON ANY OPEN APP.. FOR TESTING PURPOSES
tell application "Finder" to set appName to name of (path to frontmost application)
tell application appName to if windows is not {} then close window 1 without saving

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X