Lernen Sie den Unterschied zwischen $$ und $ bashpid in bash
- 4783
- 1400
- Matteo Möllinger
Vor kurzem habe ich an einem Shell -Skript gearbeitet und einen signifikanten Unterschied in der Bash -Spezialvariablen gesehen $ Und Bashpid verhält. Jeder in Linux ausgeführte Prozess wird mit einem Prozess zugewiesen AUSWEIS Und so umgeht das Betriebssystem den Prozess.
In ähnlicher Weise wird Ihre Bash -Terminalsitzung auch mit einer Prozess -ID zugewiesen. Es gibt eine spezielle Variable namens "$" Und "$ Bashpid" die die Prozess -ID der aktuellen Hülle speichert.
Führen Sie den folgenden Befehl aus, um zu sehen, wie hoch die Prozess -ID Ihrer aktuellen Shell ist. Beide "$" Und "$ Bashpid" wird den gleichen Wert zurückgeben.
$ echo $$ # Druckspezialvariable $ $ echo $ bashpid # Druck die Varibale $ bashpid
Aktuelle Shell -Prozess -ID finden In Bash, wenn wir ein externes Programm aus der Shell anrufen, wird ein Kinderprozess/eine Unterschale erstellt, und das Programm wird nur im untergeordneten Prozess eingereicht. Siehe unten Beispiel, wo ich einen einfachen Process Monitor -Befehl in ein Skript namens einsetzt "Probe.Sch" Um zu demonstrieren, wie die übergeordnete Shell eine Unterschale erstellt, um das Programm auszuführen.
#!/usr/bin/env bash ps -f -Forest | Grep -ich bash
Wenn wir dieses Skript jetzt ausführen, können wir die Prozess -ID von Bash erhalten. Aus dem folgenden Bild können Sie verstehen, wenn ich das Skript -Bash angerufen habe.
$ ./Probe.Sch
Linux -Kinderprozess Jetzt verwenden wir beide "$" Und "$ Bashpid" im Skript und sehen, was es zurückgibt.
#!/usr/bin/env bash echo "==========================" PS -f -Forest | grep -i bash echo "==========================" echo "PID $ für Skript $ 0 ==> $$" echo "PID mit Bashpid für Skript $ 0 ==> $ bashpid" echo
Führen Sie nun das Skript noch einmal aus.
$ ./Probe.Sch
PID des Kinderprozesses In Ordnung, es gibt die gleiche Prozess -ID zurück. Hier kommt der tatsächliche Unterschied. Erstellen wir einen weiteren untergeordneten Prozess innerhalb des Skripts, indem wir einen Befehl im Inneren ausführen Klammern ().
# Speichern Sie die PID in eine Variable… var_hash = $ (echo $$) var_bashpid = $ (echo $ bashpid) echo "Wert von var_hash ==> $ var_hash" echo "Wert von var_bashpid ==> $ var_bashpid"
Unterschied in der PID In Bash, Klammern wird einen Kinderprozess aufrufen und alles ausführen, was in den Klammern kommt. In diesem Fall beide $ Und $ Bashpid sollte eine neue Kinderprozess -ID aufbewahren. Aber aus dem obigen Bild können Sie sehen, dass es einen Unterschied gibt, wo $ Shops 382 Welches ist die übergeordnete ID (Prozess -ID des Skripts Probe.Sch), Und $ Bashpid Speichert die von Klammern erstellte erstellte Kinderprozess -ID.
Versuchen wir nun, dieses Verhalten zu verstehen. Wir werden sehen, was die Mannseite sagt.
$ MAN BASH
Mann Seite für $
Mann Seite für Bashpid Wenn Sie verwenden $, Auch in einer Unterschale speichert es die Prozess -ID des übergeordneten Prozessprozesses, aus dem er erstellt wurde. Aber Bashpid speichert die aktuelle Prozess -ID, ich.e Wenn in Klammern gerufen wird, speichert es die Kinderprozess -ID.
Wir können die Variable nicht zuweisen oder ändern $, Aber Bashpid kann neu zugewiesen werden, hat aber keine Wirkung.
$ $ = 10 $ Bashpid = 10 $ Echo $ Bashpid
Variablezuordnungen Es ist möglich zu verunehmen Bashpid. Wenn Sie verunsichert, verliert es seinen speziellen Zustand und Sie können diese auch als normale Variable verwenden.
$ uneingestellter Bashpid $ echo $ bashpid $ bashpid = "tecmint" $ echo $ bashpid
Unbegründetes bashpid Auch wenn Sie versuchen, die Prozess-ID der Shell zuzuweisen, wird sie als benutzerdefinierte Variable behandelt, da sie bereits ihren speziellen Zustand verloren hat.
$ Bashpid = $ (echo $$) $ echo $$; echo $ bashpid
Bashpid neu zuweisen In diesem Fall müssen Sie eine neue Terminalsitzung für verwenden Bashpid Um seinen besonderen Zustand zu bekommen.
Das war's für diesen Artikel. Wir haben den Unterschied zwischen gesehen $ Und Bashpid und wie sie sich in diesem Artikel verhalten. Gehen Sie diesen Artikel durch und teilen Sie Ihr wertvolles Feedback mit uns.
- « So beheben Sie die NTFS -Partition, die Fehler unter Linux nicht montieren konnten
- So installieren und konfigurieren Sie den OpenVPN -Server in CentOS 8/7 »