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

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

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.

Verwandte Lesen: Lernen Sie den Unterschied zwischen Beschaffung und Gabelung in Bash

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.