Bash'te $$ve $BASHPID Arasındaki Farkı Öğrenin
Yakın zamanda bir kabuk betiği üzerinde çalışıyordum ve $
ve BASHPID
bash özel değişkeninin davranışında önemli bir fark gördüm. Linux'ta çalışan her işleme bir işlem kimliği atanır ve işletim sistemi süreci bu şekilde yönetir.
Benzer şekilde, bash terminal oturumunuza da bir işlem kimliği atanacaktır. Geçerli kabuğun işlem kimliğini saklayan "$"
ve "$BASHPID"
adında özel bir değişken vardır.
Devam edin ve mevcut kabuğunuzun işlem kimliğinin ne olduğunu görmek için aşağıdaki komutu çalıştırın. Hem "$"
hem de "$BASHPID"
aynı değeri döndürecek.
echo $$ # Printing special variable $
echo $BASHPID # Printing the varibale $BASHPID
Bash'ta kabuktan herhangi bir harici programı çağırdığımızda, bir alt süreç/alt kabuk oluşturacak ve program yalnızca alt süreçte gönderilecektir. Ana kabuğun programı çalıştırmak için nasıl bir alt kabuk oluşturduğunu göstermek için “sample.sh” adlı bir komut dosyasına basit bir süreç izleme komutunu yerleştirdiğim aşağıdaki örneğe bakın.
#!/usr/bin/env bash
ps -ef --forest | grep -i bash
Artık bu betiği çalıştırarak bash'ın işlem kimliğini alabiliriz. Aşağıdaki görüntüden betiği çağırdığımda bash'ın bir alt süreç oluşturduğunu ve betiği çalıştırdığını anlayabilirsiniz.
./sample.sh
Şimdi betiğin içinde hem "$"
hem de "$BASHPID"
kullanalım ve ne döndürdüğünü görelim.
#!/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
Şimdi betiği tekrar çalıştırın.
./sample.sh
Tamam, aynı işlem kimliğini döndürüyor. İşte asıl fark burada ortaya çıkıyor. parentheses()
içerisinde bir komut çalıştırarak betiğin içinde başka bir alt süreç oluşturalım.
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"
Bash'ta Parantez bir alt süreci çağırır ve parantezlerin içine giren her şeyi çalıştırır. Bu durumda, hem $
hem de $BASHPID
yeni bir alt süreç kimliğini saklamalıdır. Ancak yukarıdaki resimde $
'in üst kimlik olan 382'yi depoladığı yerde bir fark olduğunu görebilirsiniz (sample.sh betiğinin İşlem Kimliği). ) ve $BASHPID
, parantezlerle oluşturulan oluşturulan alt süreç kimliğini saklar.
Şimdi bu davranışı anlamaya çalışalım. Man sayfasının ne dediğini göreceğiz.
man bash
$
kullandığınızda, bir alt kabukta bile, oluşturulduğu üst sürecin süreç kimliğini saklar. Ancak BASHPID
geçerli işlem kimliğini saklar, yani parantez içinde çağrıldığında alt süreç kimliğini saklar.
$
değişkenini atayamayız veya değiştiremeyiz, ancak BASHPID
yeniden atanabilir ancak bunun bir etkisi yoktur.
$=10
BASHPID=10
echo $BASHPID
BASHPID ayarını kaldırmak mümkündür. Ayarı kaldırdığınızda özel durumunu kaybeder ve bunu normal bir değişken olarak kullanmaya başlayabilirsiniz.
unset BASHPID
echo $BASHPID
BASHPID="Tecmint"
echo $BASHPID
Kabuğun işlem kimliğini atamaya çalışsanız bile, özel durumunu zaten kaybettiği için kullanıcı tanımlı bir değişken olarak değerlendirilecektir.
BASHPID=$(echo $$)
echo $$;echo $BASHPID
Bu durumda BASHPID'in özel durumunu elde etmek için yeni bir terminal oturumu kullanmanız gerekir.
Bu makale için bu kadar. Bu yazımızda $
ile BASHPID
arasındaki farkı ve nasıl davrandıklarını gördük. Bu makaleyi inceleyin ve değerli geri bildirimlerinizi bizimle paylaşın.