GNU/Linux >> Linux Esercitazione >  >> Linux

Perché lo script Bash non si chiude dopo l'esecuzione?

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.


Linux
  1. Opzione Rsync sconosciuta dall'esecuzione dello script Bash?

  2. Perché non riesco a sfuggire agli spazi su uno script Bash??

  3. Come faccio a conoscere il nome del file di script in uno script Bash?

  4. Pipe da/verso gli appunti nello script Bash

  5. Perché è necessario inserire #!/bin/bash all'inizio di un file di script?

Come fermare lo script Loop Bash nel terminale?

Perché non posso usare Cd in uno script Bash??

Bash + Come uscire dallo script secondario e dallo script principale in entrambi i casi?

Bash:perché lo script genitore non termina su SIGINT quando lo script figlio intercetta SIGINT?

Cosa significa set -e in uno script bash?

Genera errore in uno script Bash