Odpowiedzi:
Zmienna „$$” zawiera PID.
użyj $BASHPID
lub$$
Więcej informacji, w tym różnice między nimi, znajdziesz w instrukcji .
TL; DRTFM
$$
Rozwija się do identyfikatora procesu powłoki.
()
podpowłoce rozwija się do identyfikatora procesu powłoki wywołującej, a nie podpowłoki.$BASHPID
Rozwija się do identyfikatora procesu bieżącego procesu Bash.
()
podpowłoce rozwija się do identyfikatora procesu podpowłoki$BASHPID
jest to nowość w BASH 4. Jeśli używasz BASH 3.x, musisz użyć$$
Oprócz przykładu podanego w Advanced Bash Scripting Guide, do którego odwołuje się Jefromi , poniższe przykłady pokazują, jak potoki tworzą podpowłoki:
$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656
stdin
). Ciąg jest nazywany „ciągiem tutaj”.
PID jest przechowywany w $$
.
Przykład: kill -9 $$
zabije instancję powłoki, z której jest wywoływana.
kill -9
(z -9
flagą) jest uważane za szkodliwe i powinno być używane tylko wtedy, gdy jest to absolutnie konieczne).
kill -9 $$
dokładnie 1 rzecz. Zabija bieżący proces powłoki . Jest to przydatne, jeśli zrobiłeś coś w sesji powłoki, o której nie chcesz pisać .bash_history
:docker run -e PASSWORD=hunter2 ircbot
Możesz użyć $$
zmiennej.
Jeśli proces jest procesem potomnym, a $ BASHPID nie jest ustawione, można zapytać o ppid utworzonego procesu potomnego działającego procesu. To może być trochę brzydkie, ale działa. Przykład:
sleep 1 &
mypid=$(ps -o ppid= -p "$!")