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

Warum kann ich die Pgrep-Ausgabe nicht direkt auf eine Variable im Bash-Skript bringen?

Ich versuche, ein Skript zu erstellen, um Compton entweder zu beenden, wenn es ausgeführt wird, oder es zu starten, wenn es nicht ausgeführt wird. Ich habe von man gelesen, dass es 1 beenden sollte, wenn der Prozess gefunden wird, also habe ich versucht, ein Skript zu erstellen, das das verwendet ... Dies funktioniert jedoch einfach nicht. Es beginnt, wenn es geschlossen ist, schließt es aber nicht. was mache ich falsch ??

#!/bin/bash


status=$(pgrep compton 2>&1)

if [[ $status == 1 ]];
    then
        killall compton
    else
        exec compton -b
fi

echo $status

Akzeptierte Antwort:

Sie sind Abrufen des pgrep Ausgabe in Ihrem status Variable. Es ist einfach nicht die erwartete Ausgabe.

pgrep gibt die Prozess-IDs (PIDs) der Prozesse aus, die dem von Ihnen angegebenen Muster entsprechen. Wenn es einen Prozess gibt, dessen Name mit compton übereinstimmt , dann $status wäre die PID dieses Prozesses oder dieser Prozesse. pgrep gibt auch einen Exit-Status zurück, aber ein Exit-Status wird nicht durch eine Befehlssubstitution als Zeichenfolge erfasst.

In Ihrem Test vergleichen Sie $status gegen 1 . Es ist unwahrscheinlich, dass compton hat PID 1.

Wenn Sie irgendein compton töten wollen verarbeiten, falls vorhanden, und starten Sie compton -b wenn kein compton Prozess existiert, können Sie das mit

tun
#!/bin/sh

if ! pkill compton; then
    exec compton -b
fi

Dies verwendet den Exit-Status von pkill . Das pkill Das Tool funktioniert ähnlich wie pgrep (sie werden normalerweise als Paar verteilt und installiert), sondern statt PIDs von übereinstimmenden Prozessen wie pgrep auszugeben tun würde, pkill sendet den TERM Signal (standardmäßig) an die passenden Prozesse.

Der if Schlüsselwort verwendet den Exit-Status des Befehls, den Sie damit verwenden.

Der ! kehrt den Sinn des Tests um, sodass

  • Wenn pkill compton erfolgreich ist, bedeutet dies, dass war ein oder mehrere compton Prozesse, die jetzt beendet oder zumindest signalisiert wurden, und exec compton -b wird nicht ausgeführt.

  • Wenn pkill compton schlägt fehl (kein Prozess stimmte mit dem Namen überein oder es gab einen internen Fehler in pkill ), dem Hauptteil von if -Anweisung würde Ihre exec compton -b aufrufen , wodurch der Shell-Prozess durch den Prozess ersetzt würde, der sich aus der Ausführung von compton -b ergibt .


Linux
  1. Curl-Outfile-Variable funktioniert nicht in Bash-Skript?

  2. Rm-Befehl im Bash-Skript funktioniert nicht mit Variablen?

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

  4. Beim Erstellen des ersten Bash-Skripts kann der Cd-Befehl nicht „hängen“ bleiben?

  5. Das Umleiten der Befehlsausgabe an eine Variable in Bash schlägt fehl

Kann dieses Skript nicht verstehen. Basch ?

Ausgabe der cat-Anweisung in der Bash-Skriptschleife drucken

Verwenden Sie die Bash-Variable innerhalb des SLURM-Sbatch-Skripts

Führen Sie den Bash-Befehl auf der Jenkins-Pipeline aus

Wie man pgrep dazu bringt, die vollständigen Prozessinformationen anzuzeigen

Ausgabe des Zeitbefehls in Unix in eine Variable in Bash umleiten?