Naucz się różnicy między $$ a $ bashpid w Bash
- 4932
- 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 $ 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ą.
- « Jak naprawić partycję NTFS, nie udało się zamontować błędu w Linux
- Jak zainstalować i skonfigurować serwer OpenVPN w Centos 8/7 »