Bagaimana saya bisa mendapatkan pid dari sebuah subkulit?
Sebagai contoh:
$ echo $$
16808
Ini tidak berfungsi, karena shell asli mengembang $$
:
$ ( echo $$ )
16808
Mengapa kutip tunggal tidak berfungsi? Setelah shell asli menghapus kutipan tunggal, apakah subshell tidak berkembang $$
dengan sendirinya?
$ ( echo '$$' )
$$
Mengapa eval
tidak berhasil juga? Apakah eval
dijalankan oleh subkulit? Mengapa itu memberi saya PID shell asli?
$ ( eval echo '$$' )
16808
Terima kasih.
$$
ekspansi" vs "pid yang berbeda dalam subkulit").Jawaban:
Selain
bash
's$BASHPID
, Anda dapat melakukannya portable dengan:Contoh:
Anda dapat membuatnya menjadi fungsi:
Perhatikan bahwa beberapa shell (mis.
zsh
Atauksh93
) JANGAN memulai subproses untuk setiap subkulit yang dibuat dengan(...)
; dalam hal ini,$pid
mungkin berakhir menjadi sama dengan$$
, yang tepat, karena itu PID dari prosesgetpid
dipanggil.sumber
ksh93
, misalnya.(...)
dari contoh yang mungkin tidak menelurkan proses terpisah, seperti halnya dibash
.zsh
atauyash
mengoptimalkanfork()
perintah terakhir dalam subkulit. Mereka bahkan dapat mengoptimalkan garpu untuk subkulit jika itu adalah perintah terakhir dalam skrip sehingga Andagetpid
bahkan dapat melaporkan induknya$$
. Anda dapat mendefinisikangetpid
sebagai:getpid(){ sh -c 'echo "$PPID"'; return; }
untuk menonaktifkan menghindari masalah.exec
atau tanpa optimasi itu,sh -c ...
proses akan menjadi cucu, bukan anak dari proses di mana$(...)
substitusi perintah digunakan, dan$PPID
akan menjadi pid dari$(...)
subkulit. Itulah yang terjadi pada contohset -E
+trap ERR
bash di atas.test "$1"
menguji apakah$1
string kosong atau tidak - cara cepat dan kotor untuk menguji apakah fungsi itu diberikanvarname
argumen untuk menetapkan pid ke atau tidak; menggunakan fungsi bukanlah ide paling cemerlang di tempat pertama.Dari manual:
Terkait:
sumber
$$
dalam subshell.$BASHPID
dalam variabel dan menggunakannya dalam subkulit. Memang ada$PPID
, tapi itu PID induk dari shell dalam arti yang$$
sama dengan PID shell (tidak diatur ulang dalam subkulit). Tidak ada$BASHPPID
variabel.