Ho compilato un breve bash one-liner per mettere a fuoco un'applicazione in esecuzione o avviarla se non è in esecuzione:
#!/bin/bash
#intellilaunch.sh
wmctrl -a $1 || $1 & disown
exit 1
Il comando esce perfettamente quando viene eseguito direttamente dalla riga di comando:
:~$ wmctrl -a firefox || firefox & disown
[1] 32505
Un rapido controllo con il monitor di sistema mostra che è in esecuzione solo Firefox.
Tuttavia, quando lancio Firefox tramite lo script (./intellilaunch.sh firefox
) genera un nuovo processo persistente chiamato intellilaunch.sh firefox
, che esce solo dopo aver chiuso Firefox.
Cosa sbaglio?
Modifica :
Ho modificato il mio script secondo il suggerimento di michas:
#!/bin/bash
program=$(basename $1)
if ! wmctrl -a "$program"; then
"$1"&
fi
Non è più un one-liner ma ora funziona perfettamente!
Risposta accettata:
Non riesco a riprodurre questo comportamento sul mio sistema. Dalla tua descrizione sembra che ci sia un processo non impostato correttamente in background.
Prova a eseguire come bash -x intellilaunch.sh xclock
, questo dovrebbe mostrare cosa sta succedendo.
Anche ||
lega più forte di &
, quindi mandi l'intera pipe in background. Forse un esplicito if
sarebbe una buona idea.
Il tuo
wmctrl -a firefox || firefox & disown ; exit 1
viene interpretato come
( wmctrl -a firefox || firefox ) & disown ; exit 1
mentre probabilmente intendevi
wmctrl -a firefox || ( firefox & disown ) ; exit 1
Inoltre, bash avvierà due lavori, uno con wmctl e firefox, e un altro con disown ed exit. Poiché il lavoro in background richiede poco tempo per essere avviato, probabilmente avvierà i comandi leggermente più tardi, ecco perché l'output di bash -x
sembra essere nell'ordine sbagliato.