Website-Suche

Erfahren Sie den Unterschied zwischen $$und $BASHPID in Bash


Kürzlich habe ich an einem Shell-Skript gearbeitet und einen signifikanten Unterschied im Verhalten der Bash-Spezialvariablen $ und BASHPID festgestellt. Jedem unter Linux ausgeführten Prozess wird eine Prozess-ID zugewiesen, und so behandelt das Betriebssystem den Prozess.

Ebenso wird Ihrer Bash-Terminalsitzung auch eine Prozess-ID zugewiesen. Es gibt eine spezielle Variable namens "$" und "$BASHPID", die die Prozess-ID der aktuellen Shell speichert.

Fahren Sie fort und führen Sie den folgenden Befehl aus, um die Prozess-ID Ihrer aktuellen Shell anzuzeigen. Sowohl "$" als auch "$BASHPID" geben denselben Wert zurück.

echo $$               # Printing special variable $
echo $BASHPID         # Printing the varibale $BASHPID

Wenn wir in Bash ein externes Programm aus der Shell aufrufen, wird ein untergeordneter Prozess/eine untergeordnete Shell erstellt und das Programm wird nur im untergeordneten Prozess übermittelt. Sehen Sie sich das folgende Beispiel an, in dem ich einen einfachen Prozessüberwachungsbefehl in ein Skript namens „sample.sh“ eingefügt habe, um zu demonstrieren, wie die übergeordnete Shell eine Untershell zum Ausführen des Programms erstellt.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Wenn wir nun dieses Skript ausführen, können wir die Prozess-ID von Bash ermitteln. Aus dem Bild unten können Sie verstehen, wann ich das Skript aufrufe, bash erstellt einen untergeordneten Prozess und führt das Skript aus.

./sample.sh

Lassen Sie uns nun sowohl "$" als auch "$BASHPID" im Skript verwenden und sehen, was es zurückgibt.

#!/usr/bin/env bash
echo "============================"
ps -ef --forest | grep -i bash
echo "============================"
echo "PID USING $ FOR SCRIPT $0 ==> $$"
echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID"
echo

Führen Sie nun das Skript erneut aus.

./sample.sh

Alles klar, es gibt die gleiche Prozess-ID zurück. Hier kommt der tatsächliche Unterschied. Lassen Sie uns einen weiteren untergeordneten Prozess innerhalb des Skripts erstellen, indem wir einen Befehl in klammern() ausführen.

STORING THE PID INTO A VARIABLE…

VAR_HASH=$(echo $$)
VAR_BASHPID=$(echo $BASHPID)

echo "VALUE OF VAR_HASH ==> $VAR_HASH"
echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"

In Bash ruft Parentheses einen untergeordneten Prozess auf und führt alles aus, was in den Klammern steht. In diesem Fall sollten sowohl $ als auch $BASHPID eine neue untergeordnete Prozess-ID speichern. Aber aus dem obigen Bild können Sie erkennen, dass es einen Unterschied gibt, bei dem $ 382 speichert, was die übergeordnete ID (Prozess-ID des Skripts sample.sh ) ist. ) und $BASHPID speichert die erstellte untergeordnete Prozess-ID, die durch Klammern erstellt wird.

Versuchen wir nun, dieses Verhalten zu verstehen. Wir werden sehen, was die Manpage sagt.

man bash

Wenn Sie $ verwenden, speichert es auch in einer Subshell die Prozess-ID des übergeordneten Prozesses, aus dem es erstellt wurde. Aber BASHPID speichert die aktuelle Prozess-ID, d. h. wenn es in Klammern aufgerufen wird, speichert es die ID des untergeordneten Prozesses.

Wir können die Variable $ nicht zuweisen oder ändern, aber BASHPID kann neu zugewiesen werden, hat aber keine Auswirkung.

$=10
BASHPID=10
echo $BASHPID

Es ist möglich, BASHPID zu deaktivieren. Wenn Sie die Einstellung aufheben, verliert sie ihren Sonderzustand und Sie können sie auch als normale Variable verwenden.

unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID

Selbst wenn Sie versuchen, die Prozess-ID der Shell zuzuweisen, wird sie als benutzerdefinierte Variable behandelt, da sie ihren speziellen Status bereits verloren hat.

BASHPID=$(echo $$)
echo $$;echo $BASHPID

In diesem Fall müssen Sie eine neue Terminalsitzung für BASHPID verwenden, um seinen speziellen Status zu erhalten.

Das war’s für diesen Artikel. Den Unterschied zwischen $ und BASHPID und deren Verhalten haben wir in diesem Artikel gesehen. Lesen Sie diesen Artikel durch und teilen Sie uns Ihr wertvolles Feedback mit.