Naucz się różnicy między $$ a $ bashpid w Bash

Naucz się różnicy między $$ a $ bashpid w Bash

Niedawno pracowałem nad skryptem powłoki i widziałem znaczącą różnicę w tym, jak Bash Special Variable $ I Baszpid zachowuje się. Każdy proces działający w Linux zostanie przypisany do procesu ID I w ten sposób system operacyjny obsługuje proces.

Powiązane czytanie: Naucz się różnicy między pozyskiwaniem a rozwidleniem w Bash

Podobnie Twoja sesja terminali Bash zostanie również przypisana z identyfikatorem procesu. Istnieje specjalna zmienna o nazwie „$” I „$ Bashpid” który przechowuje identyfikator procesu bieżącej powłoki.

Śmiało i uruchom poniższe polecenie, aby zobaczyć, jaki jest identyfikator procesu bieżącej powłoki. Obydwa „$” I „$ Bashpid” zwróci tę samą wartość.

$ echo $$ # Drukowanie Zmienna Specjalna $ $ $ Bashpid # Drukowanie Varibale $ Bashpid 
Znajdź bieżący identyfikator procesu powłoki

W Bash, kiedy wywołamy dowolny program zewnętrzny z powłoki, utworzy on proces/subshell, a program zostanie przesłany tylko w procesie dziecka. Zobacz Poniższy przykład, w którym umieszczam proste polecenie monitorowania procesu w skrypcie o nazwie "próbka.cii" Aby zademonstrować, w jaki sposób powłoka nadrzędna tworzy subshell do uruchomienia programu.

#!/usr/bin/env bash ps -ef - -Forest | Grep -i Bash 

Teraz po uruchomieniu tego skryptu możemy uzyskać identyfikator procesu bash. Z poniższego obrazu możesz zrozumieć, kiedy zadzwoniłem do skryptu, tworzy proces dziecięcy i uruchamia skrypt.

$ ./próbka.cii 
Proces dzieci Linux

Teraz użyjmy obu „$” I „$ Bashpid” wewnątrz skryptu i zobacz, co powraca.

#!/usr/bin/env bash echo "===========================" PS -ef -Forest | grep -i bash echo "============================" Echo "PID za pomocą $ dla skryptu $ 0 ==> $$" echo „PID za pomocą bashpid dla skryptu 0 $ ==> $ bashpid” echo 

Teraz uruchom skrypt ponownie.

$ ./próbka.cii 
PID procesu dziecięcego

W porządku, zwraca ten sam identyfikator procesu. Oto faktyczna różnica. Utwórzmy kolejny proces dziecka w skrypcie, uruchamiając polecenie w środku zdanie wtrącone().

# Przechowywanie PID w zmienną… var_hash = $ (echo $$) var_bashpid = $ (echo $ bashpid) echo „Wartość var_hash ==> $ var_hash„ echo ”wartość var_bashpid ==> $ var_bashpid" 
Różnica w PID

W Bash, Zdanie wtrącone wywoła proces dziecka i uruchomi wszystko, co wchodzi w nawiasy. W takim przypadku oba $ I $ Bashpid powinien przechowywać nowy identyfikator procesu dziecka. Ale z powyższego obrazu widać, że istnieje różnica, gdzie $ sklepy 382 który jest identyfikatorem nadrzędnym (identyfikator procesu skryptu próbka.cii), I $ Bashpid przechowuje utworzony identyfikator procesu dziecka stworzony przez nawiasy.

Teraz spróbujmy zrozumieć to zachowanie. Zobaczymy, co mówi strona mężczyzny.

$ Man Bash 
Strona dla $ Strona Man dla Bashpid

Kiedy używasz $, Nawet w subshellowie przechowuje identyfikator procesu procesu nadrzędnego, z którego powstał. Ale Baszpid Zabezpieczy bieżący identyfikator procesu, i.e W przypadku wywołania wewnątrz nawiasów będzie przechowywać identyfikator procesu dziecka.

Nie możemy przypisać ani modyfikować zmiennej $, Ale Baszpid może być ponownie przypisane, ale nie ma to wpływu.

$ $ = 10 $ bashpid = 10 $ echo $ bashpid 
Przypisanie zmiennych Bash

Możliwe jest niepokój Baszpid. Po tym, jak się nie uwzględni, traci swój stan specjalny, a także możesz zacząć używać tego jako zmiennej normalnej.

$ unset bashpid $ echo $ bashpid $ bashpid = "tecMint" $ echo $ bashpid 
Unset Bashpid

Nawet jeśli spróbujesz przypisać identyfikator procesu powłoki, będzie traktowany jako zmienna zdefiniowana przez użytkownika, ponieważ już straciła swój specjalny stan.

$ Bashpid = $ (echo $$) $ echo $$; echo $ bashpid 
Ponowne uzgadnianie bashpid

W takim przypadku musisz użyć nowej sesji terminali dla Baszpid Aby uzyskać swój specjalny stan.

To wszystko dla tego artykułu. Widzieliśmy różnicę między $ I Baszpid i jak się zachowują w tym artykule. Przejrzyj nam ten artykuł i podziel się z nami swoją cenną opinią.