Lernen Sie den Unterschied zwischen $$ und $ bashpid in bash

- 4758
- 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

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

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

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"

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


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

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

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

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 »