Bash kabuğunda betik yazmanın incelikleri — 3

Bu flood’da Linux işletim sisteminde Bash kabuğunda (shell) çalıştırmak üzere yazılan betiklerden (script) bahsetmeye devam edeceğim.

Bir komutun çıktısını başka bir komuta vermek istediğimizde pipe, (|) operatörünü kullanabildiğimizi daha önce görmüştük. Örneğin bir metin dosyasında belirli bir kelimenin kaç satırda geçtiğini bulmak için cat file.txt | grep 'FOO' | wc -l komutları kullanılabilir.

Bash betikleri yazarken bazı durumlarda pipe, (|) kullanamayız. Bash, pipe yapılan bütün komutları ayrı bir çocuk proseste çalıştırır. Çocuk proses işini bitirip çıkış yaptıktan sonra onunla ilgili bütün bilgiler kaybolur.

Aşağıdaki örnekte dosyaki satır sayısı bir değişkene atılarak hesaplanmaya çalışılmıştır. Ancak görüldüğü üzere değişken ana betikte gösterildiğinde içi boş görünmektedir çünkü değişken çocuk prosesin bitmesi ile birlikte kaybolmuştur.

Process Substitution<(xxx)adlı yöntemlenamed pipe, (FIFO)` kullanılarak bir komut bir başka komutun çıktısını girdi olarak kullanabilir. Bütün komutlar aynı proses tarafından koşturulduğu için değişkenler, vb korunur. Aşağıda bir önceki örnekteki işlem tekrarlanmıştır.

Process Substitution'a bir başka örnek olarak, Kubernetes'in CLIkubectl'e autocomplete özelliğinin eklenmesi verilebilir. source <(kubectl completion bash) komutu ile kubectl'in otomatik tamamlamasını aktive edecek betikler kabuğa eklenmiş olur.

Özellikle otomasyon işlemleri yaparken Bash betiğinin herhangi bir hata ile karşılaştığında aldığı hata kodu ile çıkış yapmasını isteyebiliriz. Ön tanımlı olarak Bash, çalıştırdığı komutlardan biri hata alsa bile işlemlerine devam eder.

Bash'in hata alınca çıkması için set -e kullanılır. set kabuğun opsiyonlarını ayarlamak için kullanılan genel amaçlı bir komuttur. set -e ile aktifleştirilen hata modu set +e ile deaktive edilebilir.

Betik boyunca meydana gelecek hatalarda betiği sonlandırmak istersek Shebang'de /bin/bash'e parametre olarak verebiliriz. Aşağıdaki örnekte -e opsiyonu Shebang'e verilmiştir.

-e opsiyonuna benzer şekilde çok kullanılan -u ve -x opsiyonları da bulunmaktadır. -u, Bash'in önceden tanımlanmamış değişkenlerin kullanımında hata vermesini sağlar. -x opsiyonu ise betiğin debug modda çalışmasını sağlar. Aşağıda bazı örnekler verilmiştir.

Bunun dışında ilginç bir başka opsiyon -f'dir. -f, bash'in özel karakterleri açmasını (expand) engeller. Örnek olarak ls * ilgili klasördeki bütün dosyaları listelerken, set -f opsiyonu verildiğinde ismi gerçekten * olan dosyaları listelemeye çalışır.

Bazı durumlarda Bash betiklerinde hata vermesini beklediğimiz komutları da koşturabiliriz. Bu komutların verdiği hatayı yutmak (veya gözardı etmek) için || true komutunu ilgili komutun sağına ekleyebiliriz. Aşağıdaki örnekte durum özetlenmiştir.

Son olarak bir betik ile 8080 portundan yayın yapmaya başlayacak bir web sunucunun ayağa kalkıp kalkmadığını anlamak için ilgili porta belirli aralıklarla istekte bulunup until ile gelen hatayı yutabiliriz.