$ BASHPID Dan $$ berbeda dalam beberapa kasus

10

Saya sedang membaca "BASH pocket guide of Oreilly". Itu berkata:

ID proses dari proses Bash saat ini. Dalam beberapa kasus, ini dapat berbeda dari $$.

Penjelasan di atas, $BASHPIDvariabel yang dijelaskan .

Pertanyaan: kasus apa?

Teluk Persia
sumber
1
Perlu dicatat bahwa $BASHPIDini baru untuk BASH 4. Jika Anda menggunakan BASH 3.x, Anda harus menggunakan$$
Bruno Bronosky

Jawaban:

19

Contoh diberikan dalam BASHPIDdeskripsi bash manpage:

   BASHPID
          Expands to the process id of the  current  bash  process.   This
          differs  from  $$ under certain circumstances, such as subshells
          that do not require bash to be re-initialized.

Berikut ini adalah contoh dari subkulit yang mengeluarkan konten variabel, bersama dengan $$dan isi di BASHPIDluar subkulit.

$ echo $(echo $BASHPID $$)      $$       $BASHPID
              25680    16920    16920    16920
#             |        |        |        |
#             |        |        |        -- $BASHPID outside of the subshell
#             |        |        -- $$ outside of the subshell
#             |        -- $$ inside of the subshell
#             -- $BASHPID inside of the subshell
jordanm
sumber
14

Subkulit. $$ditentukan oleh POSIX dan selalu menjadi nilai dari proses shell asli. $BASHPIDadalah variabel spesifik-Bash, dan selalu merupakan nilai proses dari mana variabel didereferensi, menghitung subkulit.

 $ f() { printf '%s: %d, %d\n' "$1" $$ $BASHPID; };
 $ ${BASH_VERSION+shopt -s lastpipe}; set +m;
 $ f 1 >&2 | f 2
2: 31490, 31490
1: 31490, 32545

Saya berhasil meyakinkan pengelola mksh untuk menambahkan BASHPIDke versi terbaru, jadi ini agak portable. Dimungkinkan juga untuk mengimplementasikan BASHPIDdi ksh93 sendiri di banyak platform.

ormaaj
sumber