Bash'te Kaynak Kullanımı ve Çatallanma Arasındaki Farkı Öğrenin


Bu makalenin ana odağı, bash'ta komut dosyası vs kaynak komut dosyasını çalıştırdığınızda ne olacağını açıkça anlamaktır. Öncelikle scripti farklı şekillerde çağırdığınızda programın nasıl gönderildiğini net bir şekilde anlayacağız.

NOT: Komut dosyasını bir uzantıyla oluşturmak önemli değildir. Komut dosyası, uzantılar olmadan bile düzgün çalışacaktır.

Temel olarak her komut dosyası shebang(#!) adı verilen bir satırla başlar. Bash'taki Hash sembolü yorum olarak yorumlanacaktır ancak shebang'ın özel bir anlamı vardır. Bash'a, programı shebang'da bahsettiğiniz yorumlayıcıyla göndermesini söyler.

Aşağıda örnek bir program var ve tercümanım olarak bash'ı belirtiyorum.

cat >> Hello_World.sh
#!/usr/bin/env bash
echo "Hello world"

chmod +x Hello_world.sh

Şimdi betiği çalıştırmak için bunu iki şekilde yapabilirsiniz.

  • Komut dosyasını çağırmak için göreceli bir yol kullanın. Komut dosyasının bulunduğu dizine gidin ve ./Hello_world.sh'yi çalıştırın.
  • Komut dosyasını çağırmak için mutlak yolu kullanın. Dosya sisteminin herhangi bir yerinden betiğin tam yolunu yazın.
./Hello_world.sh
pwd
/home/karthick/Hello_world

Şimdi programınızı shebang olmadan göndermeye çalıştığınızda ne olacağını görelim. Shebang'ın yokluğunda, program hangi kabukla çalışıyorsanız ona gönderilecektir. Benim durumumda bu Bash (/bin/bash) güçlü>).

Bir örnek göstereyim. shebang olmadan bir python betiği oluşturuyorum ve programı çağırdığımda bash bu programı python yorumlayıcısına göndermesi gerektiğini bilmiyor, bunun yerine programı çalıştıracak mevcut kabukta.

cat > run-py.py
echo $SHELL
print("Hello world")

chmod +x run-py.py
./run-py.py

Bu durumda hangi tercümana gönderilmesi gerektiğini belirterek programı çağırabilir veya her zaman önerilen shebang satırını ekleyebilirsiniz.

which python3
$(which python3) /home/karthick/run_py.py

Artık betiği nasıl çağıracağınızı bildiğinize göre, bir sonraki adım betiği çağırdığımızda ne olacağını anlamak olacaktır. Komut dosyasını yukarıdaki örneklerde gösterildiği gibi çağırdığınızda, bir alt süreç oluşturulacak (çatallanma) ve komut dosyası alt sürece gönderilecektir. Yalnızca aşağıdaki komutu çalıştıracak ve betiğin bir alt işleme gönderildiğini gösteren örnek bir komut dosyası çalıştırdım.

ps -ef --forest | grep -i bash

Betiğin bir parçası olarak birden fazla alt süreç olabilir ve bu, kodumuza bağlıdır. Abonelik tarafından oluşturulan çevresel değişkenlerin, bittiğinde bırakılacağına dikkat edilmelidir. Bir alt süreç, ana süreç tarafından oluşturulan değişkenlere bunları dışa aktararak erişebilir. Ancak ana süreç, alt süreç tarafından oluşturulan değişkenlere erişemez.

Değişkenlerin nasıl çalıştığı ve değişkenlerin nasıl dışa aktarılacağı hakkında daha fazla bilgi edinmek için aşağıdaki makalelere göz atın.

  • Kabuk Komut Dosyasında 'Linux Değişkenlerini' Anlamak ve Yazmak
  • Bash'te $$ve $BASHPID Arasındaki Farkı Öğrenin

Komut Dosyasının Kaynaklanması

"Kaynak", kendisine argüman olarak iletilen dosyayı okuyan ve kodu geçerli kabuk ortamında çalıştıran yerleşik bir kabuk komutudur. Çoğunlukla kullandığınız uygun bir kullanım örneği, .bashrc veya .bash_profile dosyasındaki yapılandırmanızı değiştirmek ve source komutunu kullanarak değişiklikleri yeniden yüklemektir.

type -a source

Kaynak komutunu çalıştırmanın iki sözdizimsel yolu vardır. İki sözdiziminden herhangi birini seçebilirsiniz ve bu kişisel tercihinizdir.

source FILE_NAME [ARGUMENTS]
. FILE_NAME [ARGUMENTS]

Kaynağın gerçekte nasıl çalıştığını göstereyim. İki kabuk betiği oluşturacağım. İlk komut dosyası (Module.sh) bazı değişkenleri ve işlevleri tutacak. İkinci komut dosyası (Main.sh) değişkeni yazdıracak ve işlevi çağıracaktır.

Module.sh dosyasını açın.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo “Function f1 is called”
}

Main.sh dosyası.

#!/usr/bin/env bash

echo $VAR1
f1

Betiğin yürütme iznini ayarlayın ve ana betiği “main.sh ” olarak adlandırın. Şimdi, bu betik mevcut kabuk ortamında f1 fonksiyonunu ve VAR1 değişkenini bulmaya çalışacak ve komut bulunamadığı için başarısız olacaktır.

bash main.sh

Şimdi değişkeni ve fonksiyonları mevcut kabuk ortamına yükleyecek ve “main.sh ” tarafından erişilebilecek source komutunu script içerisinde çalıştıralım.

Module.sh dosyasını açın.

#!/usr/bin/env bash

VAR1=$(echo "Welcome to $1")

function f1(){
  echo "Function f1 is called"
}

Main.sh dosyası.

#!/usr/bin/env bash

source module.sh Tecmint
echo $VAR1
f1

Şimdi betiği tekrar çalıştırın ve görün.

bash main.sh

Kaynak, kabuk komut dosyalarımızı oluştururken modüler programlama yaklaşımını takip etmek için bash'ta çok faydalıdır. Kodumuzu daha küçük modüllere bölebilir ve birçok programda kullanabiliriz. Bu yollarla KURU (Kendinizi Tekrar Etmeyin) ilkesini takip edebiliriz.

Bu makale için bu kadar. Bash'ta kaynak kullanımı ve çatallanma arasındaki farkı kısaca tartıştık. Makaleyi inceleyin ve değerli geri bildirimlerinizi bizimle paylaşın.