Cómo usar el botón Cancelar en Osascript para dejar de ejecutar el script

Aquí está mi guión básico:

#!/bin/bash

osascript  -e 'tell application id "com.apple.systemevents"'
-e 'display dialog "Do you want to continue?" & return & return &
 " Please wait..." buttons {"Cancel", "Okay"} default button
2 cancel button "Cancel"' -e 'end tell' -e 'if button returned is "Cancel" then'
-e '<blah blah kill this script>' -e 'end if'

-- other bash stuff here

Necesito que el script se detenga si el usuario hace clic en el botón "Cancelar". Tal como está ahora, el script espera hasta que el usuario haga clic en cualquiera de los botones y luego procede a ejecutar el código bash. ¿Cómo puedo matar el guión?

Esto para poder ejecutarse en Mac OS 10.6 a 10.10, sin complementos de terceros.

Respuestas (1)

¿Qué tal esto?

  • Funciona en mi Macbook 10.6.
  • Es más limpio que tener que escapar de las comillas, etc.
  • osascript devuelve un estado como los programas normales de Unix.
  • El script Bash aborta en un estado 1de osascript.
  • No hay mensajes innecesarios de osascript ->dev/null 2>&1

No tengo nada más para probarlo. Es posible que deba ajustarse a otras versiones de OSX.

#!/bin/bash

osascript >/dev/null 2>&1 <<-EOF
tell application id "com.apple.systemevents"
   set myMsg to "Do you want to continue?" & return & return & " Please wait..."
   set theResp to display dialog myMsg buttons {"Cancel", "Okay"} default button 2 
end tell

# Following is not really necessary. Cancel returns 1 and OK 0 ...
if button returned of theResp is "Cancel" then
   return 1
end if
EOF

# Check status of osascript
if [ "$?" != "0" ] ; then
   echo "User aborted. Exiting..."
   exit 1
fi

#-- other bash stuff here
echo "All good, moving on...."

HTH

Gracias. Intenté adjuntar el osascript en EOF antes y en mi situación no funciona. De alguna manera, no ejecutará la parte bash del script, solo el applescript, es por eso que usé el osascript -e. El script es parte de una aplicación envuelta en Wineskin. El script se ejecuta a través de uno de los elementos del menú Ayuda.
Terminé agregando ` || exit 0`, que hace exactamente lo que necesito que haga, pero no entiendo por qué. De lo contrario, respondería esta pregunta yo mismo. La persona que me lo contó no me lo quiso explicar. Tal vez algún genio por aquí nos pueda iluminar. :)
¿Cómo es que el uso de EOF no funciona para usted? ¿Recibiste un error? En cuanto a su || exit 0, es un operador OR lógico que se usa como una versión abreviada del if ... thenbloque. Si su osascript lo devuelve 0, entonces no ejecuta la segunda parte, si no, entonces tiene que hacer la segunda parte.
Aparece el cuadro de diálogo, pero presionar cualquiera de los botones no tiene efecto en el script restante. Es como si terminara el guión. No sé cómo leer el eco, así que no sé cuál puede ser el error si genera uno, ¿a dónde lo envía?