Bir bash betiğinde nasıl hata ayıklanır?

How Debug Bash Script




Herhangi bir programın tüketicilere ulaşmadan önce hatasız olması gerekir. Yazılım geliştiriciler, yazılım programlarını hatasız hale getirmek için ellerinden geleni yaparlar. Ancak binlerce satır varken bir kodu hatasız yapmak zordur. Hata ayıklama devam eden bir süreçtir; hataları anında tespit etmeye, kod hakkında değerli bilgiler toplamaya ve gereksiz kod parçalarını ortadan kaldırmaya yardımcı olur.

Tüm programlama dilleri, hataları bulmak için bazı ortak ve birkaç farklı yaklaşıma sahiptir. Örneğin, hataları hızlı bir şekilde ortadan kaldırmak için hata ayıklama programları kullanılabilir. Oysa kabuk komut dosyası, kodda hata ayıklamak için belirli bir araca sahip değildir. Bu yazı, bash betiğini hatasız hale getirmek için kullanılabilecek çeşitli hata ayıklama tekniklerini tartışmakla ilgilidir. Yöntemlere dalmadan önce, kabuklar ve kabuk komut dosyası oluşturma hakkında temel bir anlayışa sahip olalım:







Linux'ta kabuk nedir?

Bilgisayarınızı başlattığınızda, çekirdek, bağlı donanım hakkında bilgi alır ve diğer bağlı bileşenlerin etkileşime girmesine izin verir. Bunun dışında belleği, CPU'yu yönetir ve yeni çevre birimlerini tanır. Sonuç olarak, bir çekirdek, herhangi bir işletim sisteminin belkemiğidir. Ancak, çekirdekle doğrudan etkileşim kurmayı, ona belirli bir görevi gerçekleştirmesini emretmeyi hiç düşündünüz mü? Bunu yapmak bile uygulanabilir mi? Kesinlikle! Etkileşimli bir arayüze sahip bir bilgisayar programı olan bir kabuk yardımıyla, herkes çekirdeği çalıştırabilir. Kabuk, insanların çekirdekle etkileşime girmesine ve herhangi bir görevi gerçekleştirmesi için talimat vermesine izin verir.



Unix'te iki ana kabuk vardır. Bourne kabuğu ve C kabuğu . Bu türlerin her ikisinin de alt kategorileri vardır. Bourne mermilerinin farklı türleri Korn kabuğu (ksh), Almquist kabuğu (kül), Bourne tekrar kabuğu (bash), ve Z kabuğu (zsh) . Aynı zamanda, C kabuğunun aşağıdaki gibi kendi alt kategorileri vardır: C kabuğu (csh) ve TENEX C kabuğu (tcsh) . Yukarıda belirtildiği gibi, tüm kabuklardan, Bash (Bourne tekrar kabuk) en yaygın kullanılan kabuktur ve verimliliği ve kullanıcı dostu olması nedeniyle birçok Linux dağıtımında kullanıma hazırdır.



Bash, birçok Linux dağıtımının varsayılan kabuğudur ve milyonlarca Linux kullanıcısı tarafından yaygın olarak kullanılmaktadır. GUI tabanlı uygulamalarda genellikle gerçekleştirdiğiniz her görevi gerçekleştirebilecek kadar çeşitli ve etkilidir. Dosyaları düzenleyebilir, dosyaları yönetebilir, fotoğrafları görüntüleyebilir, müzik dinleyebilir, video oynatabilir ve çok daha fazlasını yapabilirsiniz.





Kabuk Komut Dosyası Nedir:

Shell'in temel fikrini öğrendiğimize göre, şimdi kabuk komut dosyası oluşturmaya geçelim. Kabuk komut dosyası, belirli bir işlevi gerçekleştirmek için yorumlayıcı olarak işlev gören bir kabukta birden çok komut yürüten bir bilgisayar programıdır. Yukarıda tartışıldığı gibi, 2 özel mermi türü vardır. Ancak, bu kılavuz Bourne Again kabuğuna (Bash) odaklanmaktadır.
Peki bir bash betiği nedir? Linux'ta tüm bash komutları /usr/bin ve /bin klasörler. Örneğin, bir komut çalıştırdığınızda, bash dizinde olup olmadığını arar. Komut, dizinlerde bulunursa yürütülür, başka bir hata verir.

Terminalde çalıştırmak için birden fazla komut gerektiren bir görevi gerçekleştirmeye ne dersiniz? Bu özel durumda, bash betiği size yardımcı olabilir. Bash komut dosyası oluşturma, belirli bir görevi gerçekleştirmek için programların birden çok bash komutu çalıştırmasını sağlayan bir kabuk komut dosyası biçimidir.



Bash komut dosyasındaki hatalar nelerdir:

Bash scripting veya diğer programlama dilleri ile çalışırken birçok hata ile karşılaşıyorsunuz. Hata, programın yanlış davranmasına neden olabilecek programdaki bir hata veya hatadır.

Her programlama dilinin hataları bulmak için kendi prosedürü vardır; benzer şekilde bash, bir terminal programında hata ayıklamak için birçok yerleşik seçeneğe sahiptir.

Hataları yönetmek ve bir programda hata ayıklamak bir güçlükten daha az değildir. Bu zaman alıcı bir iştir ve programınızda hata ayıklamak için doğru araçların farkında değilseniz daha da kötüleşebilir. Bu yazı, betiğinizi hatasız hale getirmek için bash betiklerinde hata ayıklama hakkında eksiksiz bir kılavuzdur. O halde başlayalım:

Bir bash betiği nasıl hata ayıklanır:

Büyük programlama projeleri üzerinde çalışırken birçok hata veya bug ile karşılaşırsınız. Bir programda hata ayıklamak bazen karmaşık olabilir. Programcılar genellikle hata ayıklama araçlarını kullanır ve birçok kod düzenleyici de sözdizimini vurgulayarak hata bulmaya yardımcı olur.

Linux'ta kodlarda hata ayıklamak için çeşitli araçlar vardır, örneğin, GNU Hata Ayıklayıcı aka gdb. GDB gibi araçlar, ikili dosyalar halinde derlenen programlama dilleri için faydalıdır. Bash basit bir yorumlanmış dil olduğundan, hata ayıklamak için ağır araçlara gerek yoktur.

Bir bash betik kodunda hata ayıklamak için çeşitli geleneksel teknikler vardır ve bunlardan biri iddialar. İddialar, belirli koşulları kontrol etmek ve programı buna göre yürütmek için programlara eklenen koşullardır. Hataları bulmaya ve test etmeye yardımcı olan bir savunma tekniğidir. birçok bulabilirsiniz aletler bash komut dosyalarına iddia eklemeye yardımcı olan.

İddiaları eklemek eski geleneksel tekniklerden biridir. Bir bash betiğinde hata ayıklamak için bash'ta kullanılabilecek bir dizi bayrak/seçenek vardır. Bu seçenekler, komut dosyalarında shebang ile birlikte eklenebilir veya program terminalde yürütülürken eklenebilir. Ele alacağımız konular aşağıda listelenmiştir:

  1. Etkinleştirilerek bash betiği nasıl hata ayıklanır ayrıntılı -v seçenek
  2. Kullanarak bash betiği nasıl hata ayıklanır xtrace -x seçenek
  3. Kullanarak bash betiği nasıl hata ayıklanır noexec -n seçenek
  4. nasıl tanımlanır değişkenleri ayarla bash betiğinde hata ayıklarken
  5. hata ayıklama nasıl yapılır belirli kısım bash betiğinin
  6. kullanarak bir bash betiği nasıl hata ayıklanır tuzak kurmak emretmek
  7. Bir bash betiğini ortadan kaldırarak nasıl hata ayıklanır dosya küre kullanmak -F seçenek
  8. Nasıl birleştirmek kabuk komut dosyasında hata ayıklamak için hata ayıklama seçenekleri
  9. Nasıl yönlendirme hata ayıklama raporu bir dosyaya

Bir bash betiğinde hata ayıklamak için bash'deki çeşitli teknikleri kontrol edelim:

1. Ayrıntılı -v seçeneğini etkinleştirerek bash betiğinde nasıl hata ayıklanır:

Bash betiğinde hata ayıklamak için en kolay yaklaşımlardan biri, -v seçenek, ayrıca ayrıntılı olarak da bilinir. Seçenek, shebang ile eklenebilir veya yürütülürken komut dosyası adı ile açıkça yerleştirilebilir. Ayrıntılı seçenek, yorumlayıcı tarafından işlem olarak kodun her satırını yürütür ve yazdırır. Bunu bir bash betiği örneği ile anlayalım:

#! /bin/bash
dışarı attı '1 Numarayı Girin'
okuman1 numara
dışarı attı '2 Numarasını Girin'
okuman2 numara
Eğer [ '$sayı1' -gt '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'den büyük'
elif [ '$sayı1' -eq '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'ye eşittir'
Başka
dışarı attı '2 Sayısı, Sayı1'den büyük'
olmak

Yukarıdaki kod, kullanıcıdan iki sayı alıyor ve ardından sayının daha önemli, daha az veya girilen diğer sayıya eşit olup olmadığını kontrol etmek için bazı koşullu ifadeler yapıyor. Bash komut dosyası oluşturmak için herhangi bir metin düzenleyici kullanılabilse de, ben Vim düzenleyici kullanıyorum. Vim, bash betiklerinin sözdizimini vurgulayan ve sözdizimi hatası olasılığını azaltan güçlü, zengin özelliklere sahip bir düzenleyicidir. Vim düzenleyiciniz yoksa, aşağıda belirtilen komutu çalıştırarak edinin:

$sudouygunYüklemek geldim

Aşağıdakileri kullanarak bir bash komut dosyası oluşturun:

$geldimb_script.sh

Vim editöründe yeniyseniz, öğrenmenizi tavsiye ederim vim düzenleyici nasıl kullanılır devam etmeden önce.

Şimdi, komut dosyasına geri dönün, komut dosyasını kullanarak çalıştırın -v seçenek:

$bash -vb_script.sh

Yukarıdaki çıktıda, komut dosyasının her satırının yorumlayıcı tarafından işlenirken terminalde yazdırıldığı görülebilir. Komut dosyasının kullanıcıdan girdi almayı durduracağını ve ardından komut dosyasının sonraki satırını işleyeceğini unutmayın. Yukarıda tartışıldığı gibi, -v seçenek, aşağıda gösterildiği gibi shebang'dan sonra yerleştirilebilir:

#! / bin / bash -v

Benzer şekilde, ayrıntılı bayrak, Shebang'ın bir sonraki satırına şu şekilde eklenebilir: Ayarlamak emretmek:

#! /bin/bash
Ayarlamak -v

Yukarıda tartışılan yöntemlerden herhangi biri ayrıntılı etkinleştirebilir.

2 xtrace -x seçeneği kullanılarak bash betiği nasıl hata ayıklanır:

xtrace olarak da bilinen yürütme izleme, özellikle mantıksal hataları izlemek için akıllı ve kullanışlı bir hata ayıklama seçeneğidir. Mantıksal hatalar genellikle değişkenler ve komutlarla ilişkilendirilir. Komut dosyasının yürütülmesi sırasında değişkenin durumunu kontrol etmek için -x seçenek. Şimdi tekrar çalıştırın b_script.sh ile dosya -x bayrak:

$bash -xb_script.sh

Çıktı, yürütme işlemi sırasında her bir değişkenin değerini açıkça gösteriyor. Yine, -x set komutunu kullanarak shebang'ın yanında ve shebang satırından sonra kullanılabilir. xtrace, komut dosyasının her satırına + işaretini koyar.

3 noexec -n seçeneği kullanılarak bash betiği nasıl hata ayıklanır:

Sözdizimi hataları, hataların başlıca nedenlerinden biridir. Bash betiğinde sözdizimsel olarak hata ayıklamak için şunu kullanırız: noexec (yürütme yok) modu. noexec modu için kullanılan seçenek -n. Kodu yürütmek yerine yalnızca sözdizimi hatalarını görüntüler. Kodda hata ayıklamak için çok daha güvenli bir yaklaşım. hadi yürütelim b_script.sh ile tekrar -n seçenek:

$bash -nb_script.sh

Sözdizimi hatası yoksa kod yürütülmez. Şimdi kodumuzu değiştirelim:

#! /bin/bash

dışarı attı '1 Numarayı Girin'
okuman1 numara
dışarı attı '2 Numarasını Girin'
okuman2 numara
Eğer [ '$sayı1' -gt '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'den büyük'
elif [ '$sayı1' -eq '$sayı2' ]
#sonra
dışarı attı 'Sayı1, Sayı2'ye eşittir'
Başka
dışarı attı '2 Sayısı, Sayı1'den büyük'
olmak

yorum yapıyorum sonra sonrasında elif . Şimdi, -n ile yürütün b_script.sh senaryo:

$bash -nb_script.sh

Beklendiği gibi, hatayı açıkça tanımladı ve terminalde gösterdi.

4 Bash betiğinde hata ayıklarken ayarlanmamış değişkenler nasıl belirlenir:

Kod yazarken yazım hatası yapmak yaygındır. Çoğu zaman, kodun yürütülmesine izin vermeyen bir değişkeni yanlış yazarsınız. Böyle bir hatayı belirlemek için, -u seçenek. Kodu tekrar değiştirelim:

#! /bin/bash
dışarı attı '1 Numarayı Girin'
okuman1 numara
dışarı attı '2 Numarasını Girin'
okuman2 numara
Eğer [ '$sayı1' -gt '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'den büyük'
elif [ '$sayı1' -eq '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'ye eşittir'
Başka
dışarı attı '2 Sayısı, Sayı1'den büyük'
olmak

İlk olarak Eğer koşullu ifade, yeniden adlandırdım 1 numara değişken num1 . Şimdi num1 ayarlanmamış bir değişkendir. Şimdi betiği çalıştırın:

$bash -ub_script.sh

Çıktı, ayarlanmamış bir değişkenin adını tanımladı ve açıkça gösteriyor.

5. Bash betiğinin belirli bir bölümünde nasıl hata ayıklanır:

xtrace modu, kodun her satırını işler ve çıktı verir. Ancak, hataya hangi parçanın neden olduğunu zaten biliyorsak, büyük bir koddaki hataları bulmak zaman alıcı olacaktır. Neyse ki, xtrace ayrıca kodun belirli bir bölümünde hata ayıklamanıza izin verir; bu, aşağıdakiler kullanılarak gerçekleştirilebilir: Ayarlamak emretmek. Yer -x'i ayarla hata ayıklanması gereken bölümün başında ve ardından +x'i ayarla sonunda. Örneğin, koşullu ifadelerinde hata ayıklamak istiyorum. b_script.sh , bu yüzden tüm koşullu ifadeleri içine ekleyeceğim -x'i ayarla ve +x'i ayarla aşağıdaki kodda gösterildiği gibi seçenekler:

#! /bin/bash
dışarı attı '1 Numarayı Girin'
okuman1 numara
dışarı attı '2 Numarasını Girin'
okuman2 numara
Ayarlamak -x
Eğer [ '$sayı' -gt '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'den büyük'
elif [ '$sayı1' -eq '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'ye eşittir'
Başka
dışarı attı '2 Sayısı, Sayı1'den büyük'
olmak
Ayarlamak+ x

Şimdi, komut dosyasını kullanarak çalıştırın bash b_script.sh .

Çıktı, yalnızca if koşullarında belirtilen şekilde hata ayıklıyor.

6. trap komutunu kullanarak bir bash betiğinde nasıl hata ayıklanır:

Komut dosyanız karmaşıksa, hata ayıklama için daha ayrıntılı teknikler de vardır. Bunlardan biri tuzak kurmak emretmek. NS tuzak kurmak komutu, sinyalleri yakalar ve belirli bir durum meydana geldiğinde bir komutu yürütür. Komut bir sinyal veya fonksiyon olabilir. adına başka bir komut dosyası oluşturdum sum_script.sh :

#! /bin/bash
tuzak kurmak 'echo 'Satır ${LINENO}: İlk sayı $sayı1 , İkinci sayı $sayı2 ve toplam $toplam' 'HATA AYIKLAMA
dışarı attı 'İlk numarayı girin'
okuman1 numara
dışarı attı 'İkinci numarayı girin'
okuman2 numara
toplam= $[sayı1 + sayı2]
dışarı attı 'toplam şudur$toplam'

NS tuzak kurmak ile komut HATA AYIKLAMA sinyal değişkenlerin durumunu gösterir 1 numara , 2 numara ve toplam aşağıdaki çıktı görüntüsünde gösterildiği gibi her satırın yürütülmesinden sonra:

Sarı bloklar, kullanıcı henüz herhangi bir girdi girmediği için boş alanlardır; bu alanlar kullanıcı değerleri girdikçe dolar. Bu yöntem ayrıca bash betiklerinde hata ayıklamada oldukça yararlıdır.

7. -f seçeneğini kullanarak dosya globbingini ortadan kaldırarak bir bash betiğinde nasıl hata ayıklanır:

Dosya globbing, joker karakterlere sahip dosyaları bulma işlemidir, yani, * ve ? . Çoğu durumda, hata ayıklarken dosyaları genişletmeniz gerekmez. Bu gibi durumlarda, dosya globbingini şu komutu kullanarak engelleyebilirsiniz: -F seçenek. Bir senaryo ile anlayalım fglobe_script.sh :

#! /bin/bash
dışarı attı 'Tüm metin dosyalarını görüntüle.'
ls *.txt

Yukarıdaki kod, geçerli dizindeki tüm metin dosyalarını görüntüler, şunu yürütün:

$bashfglobe_script.sh

Dosya globbingini kapatmak için -F seçenek:

$bash -Ffglobe_script.sh

Benzer şekilde, onu shebang ve ile kullanabilirsiniz. Ayarlamak komut da:

#! /bin/bash
dışarı attı 'Tüm metin dosyalarını görüntüle.'
ls *.txt
Ayarlamak -F
dışarı attı 'Tüm metin dosyalarını görüntüle'
ls *.txt
Ayarlamak+f

Şimdi, koş bash fglobe_script.sh:

ekli kısım -f/ayar +f ayarla seçenekler, joker karakterlere sahip komutları işlemedi.

8. Kabuk komut dosyasında hata ayıklamak için hata ayıklama seçenekleri nasıl birleştirilir:

Yukarıda bahsedilen hata ayıklama tekniklerinde sadece bir seçenek kullanıyoruz, ancak daha iyi anlamak için çeşitli seçenekleri birleştirebiliriz. uygulayalım -x ve -v seçeneklerine sum_script.sh senaryo. kullanıyorum sum_script.sh senaryo.

#! /bin/bash
dışarı attı 'İlk numarayı girin'
okuman1 numara
dışarı attı 'İkinci numarayı girin'
okuman2 numara
toplam= $[sayı1 + sayı2]
dışarı attı 'toplam şudur$toplam'

Şimdi yürütün:

$bash -xvsum_script.sh

Her ikisi de -x ve -v çıktı görüntüsünde gösterildiği gibi çıktılar birleştirilir. Benzer şekilde, biz de birleştirebiliriz -u hata tespiti için ayrıntılı -v seçeneği. değiştiriyorum 1 numara ile değişken birde senaryonun altıncı satırında:

#! /bin/bash
NS$sayı2vetoplamNS$toplam'' HATA AYIKLAMA
dışarı attı'
İlk numarayı girin'
1 numarayı oku
dışarı attı'
İkinci numarayı girin'
2 numarayı oku
toplam=$[sayı + sayı2]
dışarı attı'
NStoplamNS$toplam'

Çıktıyı görüntülemek için aşağıda belirtilen komutu çalıştırın:

$bash -uvsum_script.sh

9. Hata ayıklama raporu bir dosyaya nasıl yönlendirilir:

Bir bash betiğinin hata ayıklama raporunu bir dosyaya kaydetmek birçok durumda kullanışlı olabilir. Hata ayıklama raporunu bir dosyaya yönlendirmek biraz zor; bazı özel değişkenler kullanıyoruz. üzerinde uygulayalım b_script.sh kod:

#! /bin/bash
yürütmek 5>dubug_report.log
BASH_XTRACED='5'
PS4='$ LINENO--'
dışarı attı '1 Numarayı Girin'
okuman1 numara
dışarı attı '2 Numarasını Girin'
okuman2 numara
Eğer [ '$sayı' -gt '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'den büyük'
elif [ '$sayı1' -eq '$sayı2' ]
sonra
dışarı attı 'Sayı1, Sayı2'ye eşittir'
Başka
dışarı attı '2 Sayısı, Sayı1'den büyük'
olmak

Kodun ikinci satırında çıktıyı bir debug_report.log kullanarak dosya yürütmek dosya tanımlayıcı 5 (FD5) ile komut.

exec 5> debug_report.log: NS yürütmek komut, kabukta olan her şeyi bir dosyaya yönlendiriyor debug_report.log.

BASH_XTRACEFD=5: Bu bir belirli bash değişkeni ve başka bir kabukta kullanılamaz. Geçerli bir dosya tanımlayıcı atanması gerekiyor ve bash, çıkarılan çıktıyı şuraya yazacak: debug_report.log.

PS4='$LINENO– ': Ayrıca, xtrace modunu kullanarak hata ayıklarken satır numarasını yazdırmak için kullanılan bir bash değişkenidir. PS4'ün varsayılan değeri + imza

Yukarıdaki komut dosyası, adlı bir günlük dosyası oluşturuyor. debug_report.log, okumak için kullanın kedi emretmek:

Çözüm:

Hatalarla dolu bir kod, programın performansını etkileyebilir ve donanıma da zarar verebilir. Hata ayıklama, programı daha verimli hale getirdiği için her program için çok önemlidir. Bir programın geliştirilmesi sırasında mevcut ve olası hataların bulunması, programınızın beklenmedik şekilde davranmasını engelleyebilir. Büyük kodlar genellikle etkin hata ayıklamaya ihtiyaç duyar ve kaynak tüketen kod parçalarını ortadan kaldırarak kodun etkinliğini artırır.

Birçok programlama dili ve ortamının kendi yardımcı hata ayıklayıcıları vardır. Bash komut dosyası oluşturmada, komut dosyasında hata ayıklamak için çeşitli teknikler uygulanabilir. Bu kılavuz, bash komut dosyalarındaki hataları bulmak için kullanılabilecek tüm yöntemlere odaklanmıştır. Bu nedenle, bash betiğinizin beklendiği gibi davranmadığını hissettiğinizde, yukarıda belirtilen tekniklerden herhangi birini kullanın, ancak çoğu durumda xtrace modu (-x) oldukça yararlıdır.