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í.