GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum wird das Bash-Skript nach der Ausführung nicht beendet?

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.


Linux
  1. Der Unterschied zwischen den Bash-Operatoren [[ Vs [ Vs ( Vs ((?

  2. Warum erkennt das Bash-Skript keine Aliase?

  3. Warum funktioniert das ~/.bash_profile nicht?

  4. Rsync Unbekannte Option von der Bash-Skriptausführung?

  5. Warum kann ich Leerzeichen in einem Bash-Skript nicht maskieren?

Wie stoppe ich das Loop Bash-Skript im Terminal?

Warum kann ich Cd nicht in einem Bash-Skript verwenden?

Bash + So beenden Sie beide Male das sekundäre Skript und das Hauptskript

Woher weiß ich den Namen der Skriptdatei in einem Bash-Skript?

So erhalten Sie den Exit-Status in einer Bash-Schleife

Was macht das -e in einem Bash-Shebang?