Ich habe einen kurzen Bash-Einzeiler zusammengestellt, um eine laufende Anwendung zu fokussieren oder sie zu starten, wenn sie nicht läuft:
#!/bin/bash
#intellilaunch.sh
wmctrl -a $1 || $1 & disown
exit 1
Der Befehl wird problemlos beendet, wenn er direkt von der Befehlszeile aus ausgeführt wird:
:~$ wmctrl -a firefox || firefox & disown
[1] 32505
Ein kurzer Check mit dem Systemmonitor zeigt, dass nur Firefox läuft.
Wenn ich Firefox jedoch über das Skript starte (./intellilaunch.sh firefox
) erzeugt es einen dauerhaften neuen Prozess namens intellilaunch.sh firefox
, die erst nach dem Schließen von Firefox beendet wird.
Was mache ich falsch?
Bearbeiten :
Ich habe mein Skript nach Michas’ Vorschlag modifiziert:
#!/bin/bash
program=$(basename $1)
if ! wmctrl -a "$program"; then
"$1"&
fi
Kein Einzeiler mehr, aber es funktioniert jetzt perfekt!
Akzeptierte Antwort:
Ich kann dieses Verhalten auf meinem System nicht reproduzieren. Aus Ihrer Beschreibung geht hervor, dass ein Prozess nicht richtig in den Hintergrund gesetzt wurde.
Versuchen Sie, als bash -x intellilaunch.sh xclock
auszuführen , das sollte zeigen, was los ist.
Auch ||
bindet stärker als &
, also schickst du die ganze Pipe in den Hintergrund. Vielleicht ein explizites if
wäre eine gute Idee.
Ihr
wmctrl -a firefox || firefox & disown ; exit 1
wird interpretiert als
( wmctrl -a firefox || firefox ) & disown ; exit 1
wobei Sie wahrscheinlich gemeint haben
wmctrl -a firefox || ( firefox & disown ) ; exit 1
Aus diesem Grund startet bash zwei Jobs, einen mit wmctl und firefox – und einen weiteren mit disown und exit. Da der Hintergrundjob eine kurze Zeit zum Starten benötigt, wird er die Befehle wahrscheinlich etwas später starten, daher die Ausgabe von bash -x
scheint in der falschen Reihenfolge zu sein.