Naucz się różnicy między $$ a $ bashpid w Bash
- 4884
- 894
- Ignacy Modzelewski
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.
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 $ BashpidZnajdź 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.ciiProces 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.ciiPID 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 BashStrona 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 $ bashpidPrzypisanie 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 $ bashpidUnset 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 $ bashpidPonowne 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ą.
- « Jak naprawić partycję NTFS, nie udało się zamontować błędu w Linux
- Jak zainstalować i skonfigurować serwer OpenVPN w Centos 8/7 »