Pelajari Perbedaan Antara $$dan $BASHPID di Bash


Baru-baru ini saya sedang mengerjakan skrip shell dan saya melihat perbedaan yang signifikan dalam perilaku variabel khusus bash $ dan BASHPID. Setiap proses yang berjalan di Linux akan diberi ID proses dan begitulah cara sistem operasi menangani proses tersebut.

Demikian pula, sesi terminal bash Anda juga akan diberi ID proses. Ada variabel khusus bernama "$" dan "$BASHPID" yang menyimpan ID proses dari shell saat ini.

Silakan dan jalankan perintah di bawah ini untuk melihat ID proses shell Anda saat ini. Baik "$" dan "$BASHPID" akan mengembalikan nilai yang sama.

echo $$               # Printing special variable $
echo $BASHPID         # Printing the varibale $BASHPID

Di bash ketika kita memanggil program eksternal apa pun dari shell, itu akan membuat proses anak/subkulit dan program tersebut akan dikirimkan dalam proses anak saja. Lihat contoh di bawah ini di mana saya meletakkan perintah monitor proses sederhana dalam skrip bernama “sample.sh” untuk menunjukkan bagaimana shell induk membuat subkulit untuk menjalankan program.

#!/usr/bin/env bash

ps -ef --forest | grep -i bash

Sekarang saat menjalankan skrip ini kita bisa mendapatkan ID proses bash. Dari gambar di bawah, Anda dapat memahami ketika saya memanggil skrip bash, membuat proses anak dan menjalankan skrip.

./sample.sh

Sekarang mari kita gunakan "$" dan "$BASHPID" di dalam skrip dan lihat apa yang dikembalikannya.

#!/usr/bin/env bash
echo "============================"
ps -ef --forest | grep -i bash
echo "============================"
echo "PID USING $ FOR SCRIPT $0 ==> $$"
echo "PID USING BASHPID FOR SCRIPT $0 ==> $BASHPID"
echo

Sekarang jalankan skripnya lagi.

./sample.sh

Baiklah, ini mengembalikan ID proses yang sama. Inilah perbedaan sebenarnya. Mari buat proses anak lainnya di dalam skrip dengan menjalankan perintah di dalam tanda kurung().

STORING THE PID INTO A VARIABLE…

VAR_HASH=$(echo $$)
VAR_BASHPID=$(echo $BASHPID)

echo "VALUE OF VAR_HASH ==> $VAR_HASH"
echo "VALUE OF VAR_BASHPID ==> $VAR_BASHPID"

Di bash, Kurung akan memanggil proses anak dan menjalankan apa pun yang ada di dalam tanda kurung. Dalam hal ini, $ dan $BASHPID harus menyimpan ID proses anak baru. Namun dari gambar di atas terlihat ada perbedaan dimana $ menyimpan 382 yang merupakan ID induk (ID Proses dari skrip sample.sh), dan $BASHPID menyimpan ID proses anak yang dibuat dengan tanda kurung.

Sekarang mari kita coba memahami perilaku ini. Kita akan melihat apa yang tertulis di halaman manual.

man bash

Saat Anda menggunakan $, bahkan dalam subkulit, ia menyimpan ID proses dari proses induk tempat pembuatannya. Tapi BASHPID akan menyimpan ID proses saat ini, yaitu ketika dipanggil di dalam tanda kurung maka akan menyimpan ID proses anak.

Kami tidak dapat menetapkan atau mengubah variabel $, tetapi BASHPID dapat ditugaskan kembali tetapi tidak berpengaruh.

$=10
BASHPID=10
echo $BASHPID

Anda dapat membatalkan setelan BASHPID. Jika Anda tidak menyetelnya, status khususnya akan hilang dan Anda juga dapat mulai menggunakan ini sebagai variabel normal.

unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID

Bahkan jika Anda mencoba untuk menetapkan ID proses shell, itu akan diperlakukan sebagai variabel buatan pengguna karena sudah kehilangan status khususnya.

BASHPID=$(echo $$)
echo $$;echo $BASHPID

Dalam hal ini, Anda harus menggunakan sesi terminal baru untuk BASHPID untuk mendapatkan status khususnya.

Itu saja untuk artikel ini. Kita telah melihat perbedaan antara $ dan BASHPID dan bagaimana perilakunya di artikel ini. Baca artikel ini dan bagikan masukan Anda yang berharga kepada kami.