Léiert den Ënnerscheed tëscht $$an $BASHPID zu Bash


Viru kuerzem hunn ech un engem Shell-Skript geschafft an ech hunn e wesentlechen Ënnerscheed gesinn wéi Bash speziell Variabel $ an BASHPID sech behält. All Prozess, deen a Linux leeft, gëtt mat enger Prozess-ID zougewisen an dat ass wéi de Betribssystem de Prozess behandelt.

Ähnlech gëtt Är Bash Terminal Sessioun och mat enger Prozess ID zougewisen. Et gëtt eng speziell Variabel genannt \$\ an \$BASHPID\ déi d'Prozess-ID vun der aktueller Shell späichert.

Gitt vir a lafen de Kommando ënnen fir ze kucken wat d'Prozess ID vun Ärer aktueller Shell ass. Béid \$\ an \$BASHPID\ ginn dee selwechte Wäert zréck.

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

Am Bash wa mir all externe Programm vun der Shell nennen, erstellt et e Kandprozess/Subshell an de Programm gëtt nëmmen am Kandprozess presentéiert. Kuckt hei ënnendrënner Beispill wou ech en einfache Prozessmonitor Kommando an engem Skript mam Numm sample.sh setzen fir ze demonstréieren wéi d'Eltereschuel eng Ënnershell erstellt fir de Programm ze lafen.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Elo beim Laafen vun dësem Skript kënne mir de Prozess ID vu bash kréien. Aus dem Bild hei drënner kënnt Dir verstoen wann ech de Skript bash genannt hunn e Kandprozess erstellt an de Skript lafen.

$ ./sample.sh

Loosst eis elo souwuel \$\ an \$BASHPID\ am Skript benotzen a kucken wat et zréckkënnt.

#!/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

Elo lafen de Skript erëm.

$ ./sample.sh

Gutt, et gëtt déiselwecht Prozess ID zréck. Hei kënnt den eigentlechen Ënnerscheed. Loosst eis en anere Kannerprozess am Skript erstellen andeems Dir e Kommando bannent Klammern() leeft.

# 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"

Am Bash, Klammeren ruffen e Kannerprozess op a lafen alles wat an de Klammern kënnt. An deem Fall solle souwuel $ wéi och $BASHPID eng nei Kandprozess-ID späicheren. Awer aus dem uewe Bild kënnt Dir gesinn datt et en Ënnerscheed ass wou $ 382 späichert wat d'Elteren ID ass (Prozess ID vum Skript sample.sh), an $BASHPID späichert déi erstallt Kand Prozess ID erstallt duerch parentheses.

Loosst eis elo probéieren dëst Verhalen ze verstoen. Mir wäerte gesinn wat d'Man Säit seet.

$ man bash

Wann Dir $ benotzt, och an enger Subshell, späichert et d'Prozess-ID vum Elterendeel, aus deem et erstallt gouf. Awer BASHPID späichert déi aktuell Prozess ID, dh wann se an Klammeren opgeruff gëtt, späichert se d'Kandprozess ID.

Mir kënnen d'Variabel $ net zouginn oder änneren, awer BASHPID kann nei zougewisen ginn, awer et huet keen Effekt.

$ $=10
$ BASHPID=10
$ echo $BASHPID

Et ass méiglech BASHPID auszeschalten. Wann Dir unset, verléiert et säi speziellen Zoustand an Dir kënnt och ufänken dëst als normal Variabel ze benotzen.

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

Och wann Dir probéiert d'Prozess ID vun der Shell ze ginn, gëtt se als Benotzerdefinéiert Variabel behandelt well se scho säi speziellen Zoustand verluer huet.

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

An dësem Fall musst Dir eng nei Terminal Sessioun fir BASHPID benotzen fir säi spezielle Staat ze kréien.

Dat ass et fir dësen Artikel. Mir hunn den Ënnerscheed tëscht $ an BASHPID gesinn a wéi se sech an dësem Artikel behuelen. Gitt duerch dësen Artikel an deelt Äre wäertvolle Feedback mat eis.