Pregunta

En OS X, quiero ejecutar un comando osascript que espere hasta que una determinada aplicación especificada por su ruta completa .app haya salido y luego inicie otra aplicación, por ejemplo.usando /usr/bin/open -n /Applications/MyApp.app.

¿Cómo lograr la espera hasta que la aplicación haya salido?

¿Fue útil?

Solución

Un enfoque común es realizar un bucle de espera, por ejemplo con pgrep:

while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done

Desafortunadamente, esto dormirá demasiado y retrasará el inicio de la otra aplicación.

Alternativamente, si sabe que la aplicación se está ejecutando, puede usar /usr/bin/open:

open -g -W /Applications/TextEdit.app

Desafortunadamente, esto abrirá la aplicación si no se estaba ejecutando.Puedes comprobar que está funcionando antes de llamar. /usr/bin/open, pero esto no sería atómico:podría estar cerrándose y el comando de apertura podría reiniciarlo.

Ambos pueden encapsularse en osascript (aunque probablemente no tenga mucho sentido).

osascript -e 'do shell script "while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done"'
osascript -e 'do shell script "open -g -W /Applications/TextEdit.app"'

Como nota al margen: open -W en realidad realiza una espera kqueue (espera sin sondeo) en el proceso.Es posible que haya otros comandos que invoquen kqueue y realicen la misma tarea sin correr el riesgo de reiniciar la aplicación.Es bastante fácil de implementar en C.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top