Warten Sie, bis eine bestimmte Anwendung beendet wurde, und starten Sie dann eine andere
Frage
Unter OS X möchte ich einen Osascript-Befehl ausführen, der wartet, bis eine bestimmte Anwendung vollständig angegeben ist.app-Pfad wurde beendet, dann starten Sie eine andere Anwendung, z.wobei /usr/bin/open -n /Applications/MyApp.app
.
Wie erreiche ich das Warten, bis die Anwendung beendet wurde?
Lösung
Ein gängiger Ansatz besteht darin, eine Warteschleife durchzuführen, zum Beispiel mit pgrep
:
while pgrep -f /Applications/TextEdit.app 2>/dev/null ; do sleep 1.0 ; done
Leider wird dies zu viel schlafen und den Start der anderen Anwendung verzögern.
Wenn Sie wissen, dass die Anwendung ausgeführt wird, können Sie alternativ Folgendes verwenden /usr/bin/open
:
open -g -W /Applications/TextEdit.app
Leider wird dadurch die Anwendung geöffnet, wenn sie nicht ausgeführt wurde.Sie können überprüfen, ob es ausgeführt wird, bevor Sie anrufen /usr/bin/open
, aber das wäre nicht atomar:es könnte geschlossen werden und der Befehl öffnen könnte es neu starten.
Beide können in osascript gekapselt werden (obwohl es wahrscheinlich nicht viel Sinn ergibt).
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"'
Als Randnotiz: open -W
führt tatsächlich eine kqueue-Wartezeit (Wartezeit ohne Abfrage) für den Prozess durch.Möglicherweise gibt es andere Befehle, die kqueue aufrufen und dieselbe Aufgabe ausführen, ohne das Risiko eines Neustarts der Anwendung einzugehen.Es ist ziemlich einfach in C zu implementieren.