Question

Sous OS X, je souhaite exécuter une commande osascript qui attend la fermeture d'une certaine application spécifiée par son chemin .app complet, puis démarrer une autre application, par exemple.en utilisant /usr/bin/open -n /Applications/MyApp.app.

Comment réaliser l'attente jusqu'à la fermeture de l'application ?

Était-ce utile?

La solution

Une approche courante consiste à effectuer une boucle d'attente, par exemple avec pgrep:

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

Malheureusement, cela va trop dormir et retarder le démarrage de l'autre application.

Alternativement, si vous savez que l'application est en cours d'exécution, vous pouvez utiliser /usr/bin/open:

open -g -W /Applications/TextEdit.app

Malheureusement, cela ouvrira l'application si elle n'était pas en cours d'exécution.Vous pouvez vérifier qu'il fonctionne avant d'appeler /usr/bin/open, mais ce ne serait pas atomique :il pourrait être en train de se fermer et la commande open pourrait le redémarrer.

Les deux peuvent être encapsulés dans osascript (même si cela n'a probablement pas beaucoup de sens).

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"'

En remarque : open -W effectue en fait une attente kqueue (attente sans interrogation) sur le processus.Il peut y avoir d'autres commandes appelant kqueue et effectuant la même tâche sans risquer de redémarrer l'application.C’est assez simple à implémenter en C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top