GNU/Linux >> Znalost Linux >  >> Linux

Proč se skript Bash po spuštění neukončí?

Zkompiloval jsem krátký bash one-liner, abych zaměřil běžící aplikaci nebo ji spustil, pokud neběží:

#!/bin/bash
#intellilaunch.sh

wmctrl -a $1 || $1 & disown
exit 1

Příkaz se ukončí naprosto v pořádku, když je spuštěn přímo z příkazového řádku:

:~$ wmctrl -a firefox || firefox & disown
[1] 32505

Rychlá kontrola pomocí monitoru systému ukazuje, že je spuštěn pouze firefox.

Když však spustím firefox pomocí skriptu (./intellilaunch.sh firefox ) vytváří přetrvávající nový proces nazvaný intellilaunch.sh firefox , který se ukončí až po zavření firefoxu.

Co dělám špatně?

Upravit :

Upravil jsem svůj skript podle michasova návrhu:

#!/bin/bash

program=$(basename $1)

if ! wmctrl -a "$program"; then
  "$1"&
fi

Už to není jednovrstvý, ale nyní funguje naprosto dobře!

Přijatá odpověď:

Toto chování nemohu na svém systému reprodukovat. Z vašeho popisu to zní, jako by tam byl proces, který není správně nastaven na pozadí.

Zkuste spustit jako bash -x intellilaunch.sh xclock , to by mělo ukázat, co se děje.

Také || vazby silnější než & , proto pošlete celou dýmku na pozadí. Možná explicitní if byl by to dobrý nápad.

Vaše

wmctrl -a firefox || firefox & disown ; exit 1

se vykládá jako

( wmctrl -a firefox || firefox ) & disown ; exit 1

zatímco jste pravděpodobně mysleli

wmctrl -a firefox || ( firefox & disown ) ; exit 1 

Díky tomu bash spustí dvě úlohy, jednu s wmctl a firefox – a druhou s disown a exit. Protože úloha na pozadí potřebuje ke spuštění krátkou dobu, pravděpodobně spustí příkazy o něco později, proto je výstup bash -x zdá se, že je ve špatném pořadí.


Linux
  1. Rsync Neznámá možnost ze spuštění skriptu Bash?

  2. Bash + Jak opustit sekundární skript a hlavní skript v obou případech?

  3. Jak poznám název souboru skriptu ve skriptu Bash?

  1. Proč potřebujete umístit #!/bin/bash na začátek souboru skriptu?

  2. Jakýkoli způsob, jak ukončit bash skript, ale ne opustit terminál

  3. Jak získat stav ukončení smyčky v bash

  1. Vyvolat chybu ve skriptu Bash

  2. Po přihlášení spusťte bash skript

  3. Co dělá -e v bash shebang?