Domanda

On OS X Voglio eseguire un comando di ossatura che attende fino a quando una certa applicazione specificata dal suo percorso .App completo è uscito, quindi avviare un'altra applicazione, ad es.usando /usr/bin/open -n /Applications/MyApp.app.

Come raggiungere l'attesa fino a quando l'applicazione non è uscita?

È stato utile?

Soluzione

Un approccio comune è quello di eseguire un loop di attesa, ad esempio con pgrep:

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

Sfortunatamente, questo dormirà troppo e ritarderà l'inizio dell'altra applicazione.

In alternativa, se si sa che l'applicazione è in esecuzione, è possibile utilizzare /usr/bin/open:

open -g -W /Applications/TextEdit.app
.

Sfortunatamente, questo aprirà l'applicazione se non è in esecuzione.È possibile controllare che sia in esecuzione prima di chiamare /usr/bin/open, ma questo non sarebbe atomico: potrebbe essere la chiusura e il comando aperto potrebbe riavviarlo.

Entrambi possono essere incapsulati in ossext (anche se probabilmente non ha molto senso).

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

Come nota laterale: open -W esegue effettivamente un kqueue Attendere (non polling Attendere) sul processo.Potrebbero esserci altri comandi che richiamano KQUEUE e eseguendo lo stesso compito senza rischiare di riavviare l'applicazione.È abbastanza facile implementare in c.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top