Belge

Linux’ta Bash Shell Komut Dosyasında Hata Ayıklama

Programlama dillerinin çoğunda, hata ayıklama için hata ayıklayıcı aracı mevcuttur. Hata ayıklayıcı, bir programı veya komut dosyasını çalıştırabilen ve komut dosyasının veya programın içindekileri çalışırken incelemenizi sağlayan bir araçtır.

Bu yazıda, linux’ta bir bash kabuk betiğinde satır satır hata ayıklamayı öğreneceğiz. Kabuk betiğinde herhangi bir hata ayıklayıcı aracımız yoktur, ancak -n, -v ve -x gibi bash komut satırı seçeneklerinin yardımıyla hata ayıklamayı yapabiliriz.

Shell Komut Dosyasını Sözdizimi Hatası İçin Kontrol Etme

Bash komutunda -n seçeneğini kullanarak betiği çalıştırdığımızda betiği çalıştırmayacak, betiği okuyacak ve sözdizimini doğrulayacak ve varsa hataları bildirecektir.

Başka bir deyişle, -n seçeneği, noexec için shot (yürütme yok gibi) diyebiliriz, Shell’e komutları çalıştırmamasını söyler. Bunun yerine, kabuk yalnızca sözdizimi hatalarını kontrol eder.

Aşağıdaki içeriğe sahip bir komut dosyası oluşturalım,

$ vi debug_quotes.sh
#!/bin/bash
echo "USER=$USER"
echo "Today's Date: $(date)
echo "SHELL=$SHELL"

dosyayı kaydedip kapatın.

Şimdi betiği -n seçeneğiyle çalıştırmayı deneyin,

$ bash -n debug_quotes.sh
debug_quotes.sh: line 4: unexpected EOF while looking for matching `"'
debug_quotes.sh: line 5: syntax error: unexpected end of file
$

Yukarıdaki çıktı, sözdizimi hatası olduğunu, çift tırnak ‘”’ eksik olduğunu gösteriyor. Bunu düzeltmek için, bugünün tarihini gösteren satırın sonuna çift tırnak işareti koyun.

Debug-Quotes-Shell-Script-Linux

Kabuk Komut Dosyasını Ayrıntılı Modda Çalıştırma

Bash komutundaki -v seçeneği, kabuk betiğine ayrıntılı modda çalışmasını söyler. Pratikte bu, kabuğun komutu çalıştırmadan önce her komutu tekrarlayacağı anlamına gelir. Bu, çoğu zaman hataları bulmaya yardımcı olabileceği için çok kullanışlıdır.

Aşağıdaki içeriğe sahip “listusers.sh” adında bir kabuk betiği yapalım,

$ vi listusers.sh
#!/bin/bash
cut -d : -f1,5,7 /etc/passwd | grep -v sbin | grep sh | sort > /tmp/users.txt
awk -F':' ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt

#Clean up the temporary file.
/bin/rm -f /tmp/users.txt

Komut dosyasını -v seçeneğiyle yürütün,

$ bash -v listusers.sh

çıktı,

list-users-script-output-linux

Yukarıdaki çıktıda, komut dosyası çıktısı, komut dosyalarının komutlarıyla karıştırılır. Ancak -v seçeneğiyle, en azından betiğinizi çalıştırırken kabuğun ne yaptığına dair daha iyi bir görüş elde edersiniz.

Komut Dosyasını -n ve -v seçeneğiyle çalıştırma

Komut satırı seçeneklerini ( -n & -v ) birleştirebiliriz. Bu, komut dosyası çıktısını görüntülerken bir komut dosyasının sözdizimini kontrol edebildiğimiz için iyi bir kombinasyon oluşturur.

Daha önce kullanılan “debug_quotes.sh” betiğini ele alalım.

$ bash -nv debug_quotes.sh
#!/bin/bash
echo "USER=$USER"
echo "Today's Date: $(date)
echo "SHELL=$SHELL"
debug_quotes.sh: line 4: unexpected EOF while looking for matching `"'
debug_quotes.sh: line 5: syntax error: unexpected end of file
$

Kabuk Komut Dosyasında Satır Satır Hata Ayıklama

xtrace veya yürütme izlemesinin kısaltması olan -x seçeneği, kabuk değiştirme adımlarını gerçekleştirdikten sonra her komutu tekrarlamasını söyler. Böylece değişkenlerin ve komutların değerlerini görebiliriz. Çoğu zaman, bu seçenek tek başına bir sorunu teşhis etmeye yardımcı olur.

Çoğu durumda, -x seçeneği bir komut dosyası hakkında en yararlı bilgileri sağlar, ancak çok fazla çıktıya yol açabilir. Aşağıdaki örnek, bu seçeneği çalışırken göstermektedir.

$ bash -x listusers.sh
+ sort
+ grep sh
+ grep -v sbin
+ cut -d : -f1,5,7 /etc/passwd
+ awk -F: ' { printf ( "%-12s %-40s\n", $1, $2 ) } ' /tmp/users.txt
linuxtechi linuxtechi,,,
root root
+ /bin/rm -f /tmp/users.txt
$

Gördüğümüz gibi, kabuk her komutun önüne bir + işareti eklemiştir.

ShellCheck ile Kabuk Komut Dosyasında Hata Ayıklama

Shellcheck, bash veya kabuk betiklerimiz için uyarılar ve öneriler sağlayan ücretsiz bir araçtır. Kabuk betiğimizin sözdizimi sorunlarına ve anlamsal sorunlarına işaret eder.

Shellcheck’i kullanmak için önce aşağıdaki komutu kullanarak kurun,

$ sudo apt install shellcheck     // Ubuntu & Debian

RHEL / Fedora / CentOS için

$ sudo dnf install epel-release -y
$ sudo dnf install ShellCheck

Yukarıdaki hata ayıklama betiğini kullanalım ve üzerinde shellcheck çalıştıralım,

$ shellcheck debug_quotes.sh
ShellCheck-Script-Output

Uyarı mesajını bastırmak için aşağıda gösterildiği gibi -e parametresini kullanın,

$ shellcheck -e SC1078 debug_quotes.sh
Exclude-Warning-Shellscheck-Script

Yukarıdaki çıktı, 3. satırda bir sözdizimi hatası olduğunu onaylar, 3. satırın sonuna çift tırnak koyarsak sözdizimi hatası giderilir.

Yazının orijinalini buradan okuyabilirsiniz.