Dalam bash, Anda memiliki variabel praktis ini: $ BASHPID yang selalu mengembalikan PID subshell yang saat ini berjalan. Bagaimana saya bisa mendapatkan PID subkulit dalam ksh? Misalnya lihat kode di bawah ini:
#!/usr/bin/ksh93
echo "PID at start: $$"
function run_in_background {
echo "PID in run_in_background $$"
run_something &
echo "PID of backgrounded run_something: $!"
}
function run_something {
echo "*** PID in run_something: $$"
sleep 10;
}
run_in_background
echo "PID of run in background $!"
Ini menghasilkan yang berikut:
PID at start: 5328
PID in run_in_background 5328
*** PID in run_something: 5328
PID of backgrounded run_something: 5329
PID of run in background 5329
Apa yang saya inginkan adalah baris yang dimulai dengan ****
menampilkan PID subshell, dalam kasus contoh yang akan menjadi 5329.
sumber
$(exec sh -c 'echo $PPID')
Namun perintah sederhana awalsh -c 'echo $PPID'
memberikan PID ketiga. Jadi terima kasih atas solusinya. Diterima(sh -c 'echo $PPID')
untuk menghindari membuat subkulit. Berbeda dengan(sh -c 'echo $PPID'; true)
. Pengoptimalan ini hanya berlaku jika Anda mencoba mengakses$BASHPID
sebagai hal terakhir sebelum subkulit keluar, yaitu hanya dalam kasus di mana Anda tidak dapat melakukan apa pun dengan nilai tersebut. Jadi dalam praktiknya, Anda bisa menggantinya$BASHPID
dengan$(sh -c 'echo $PPID')
.sh -c 'echo $PPID'
.Anda dapat mencapai apa yang Anda inginkan, tetapi Anda harus meletakkan run_something ke dalam skrip terpisah. Saya tidak begitu yakin mengapa, tetapi $$ tidak dievaluasi kembali ketika digunakan dalam fungsi dalam skrip yang sama yang memanggilnya. Saya kira nilai $$ diberikan setelah skrip diuraikan dan sebelum dijalankan.
run_in_background.sh
run_something.sh
keluaran
sumber
sumber
if [[ ${!KSH_VERSION} = .sh.version ]]; then
(hanya satu=
) danelif [[ -z ${BASHPID+_} ]]; then
(hindari menggunakan implisit-n
dalam tanda kurung ganda, pdksh lama tidak mengetahuinya).Mengikuti jawaban oleh @Gilles yang saya temui ketika sedang memecahkan masalah lain yang saya miliki, saya mengumpulkan program tes cepat yang mendukung teori bahwa jawaban yang benar adalah:
Saya menemukan ada saat-saat ketika
exec
tidak diperlukan tetapi saya mengkonfirmasi bahwa menggunakannya adalah satu-satunya cara untuk mendapatkan pid yang benar sepanjang waktu di semua kerang yang saya coba. Ini tes saya:dan hasilnya
Pengganti shell favorit Anda dalam peristiwa tersebut:
sh
,bash
,mksh
,ksh
, dll ...Saya tidak mengerti mengapa case 2 dan 3 memberikan hasil yang berbeda, atau mengapa hasil untuk case 3 berbeda antara shell. Saya mencoba
bash
,ksh
danmksh
pada Arch Linux FWIW.sumber
sumber