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.