Lernen Sie den Unterschied zwischen $$ und $ bashpid in bash
- 4710
- 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 $ bashpidAktuelle 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.SchLinux -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.SchPID 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 BASHMann 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 $ BashpidVariablezuordnungen
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 $ bashpidUnbegrü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 $ bashpidBashpid 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 »