Bash veya sh programlama *nix sistemlerde kullanıldığından herkesin az biraz bilmesi gereken dillerden1 biri.
O siyah ekranda yapması zor olan işlemlerden biri de, bildiğiniz üzere hata ayıklama işlemi(debug). Gerçekten bazen insanın kafasını, sadece bir if koşulunun çalışıp çalışmadığını anlaması için bayağı bir işlem yapması gerekiyor.
Bu halde iken daha fazla dayanamayarak Bash ile nasıl debug yapılacağı hakkında araştırma yaptım ve bu işin o kaliteli IDE’lerdeki gibi olmasada, daha fazla zaman ve efor sarfetmemek için bu işin kısayolunu buldum diyebilirim.
Bildiğiniz üzere Script dillerinin özelliklerinden biri olan bütün kodu derlemeden işlem yapabilmenizdir.
Mesela bir program yazıyoruz ve dışarıdan bize bir girdi(input) geliyor ve o gelen sayının String mi yoksa Integer değer mi olduğunu anlamak için bir script yazıyoruz.
1 2 3 4 5 6 7 8 |
#!/bin/bash re='^[0-9]+$' if ! [[ $valueOfCheck =~ $re ]]; then echo "error: Not a number" exit 1 elif [ $valueOfCheck -gt 0 ]; then echo "That's a number"; functionX fi |
Ve bu yazdığımız Regex’in doğru çalışıp çalışmadığını kontrol etmekmiz gerekiyor
1 2 |
bash deneme.sh error: Not a number |
Evet bu kodu çalıştırdığımızda bu sayı değil gibi bir uyarı geliyor ve biz burada gördüğünüz gibi herhangi bir sayı atamadık yani dışardan gelmesi gereken sayı buralara hiç uğramadı.
Şimdi bu kodu herşeyin farkında olarak çalıştıralım ve debug edelim.
Bunu yapmak bash programlamada gayet kolay bunu yaparken kontrol edilecek kod bloğunun başına set -x sonuna set +x koyalım
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash set -x re='^[0-9]+$' if ! [[ $valueOfCheck =~ $re ]]; then echo "error: Not a number" ; exit 1 elif [ $valueOfCheck -gt 0 ]; then echo "That's a number"; functionX fi set +x |
böyle yaparak çalıştırdığımızda
1 2 3 4 5 |
+ re='^[0-9]+$' + [[ '' =~ ^[0-9]+$ ]] + echo 'error: Not a number' ; exit 1 error: Not a number + exit 1 |
gibi bir çıktı gelicek buda demek oluyorki + ile başlayan satırlar okundu ve gerekli işlemler yapıldı.
+ [[ '' =~ ^[0-9]+$ ]] satırında gördüğünüz üzere ” değeri boş ve oradan neden sıkıntı çıktığını anlayabiliriz.
Şimdi ValueOfCheck değerine 5 atayalım ve çalıştırıp farkı görelim
1 2 3 4 5 6 7 8 9 |
#!/bin/bash re='^[0-9]+$' valueOfCheck=5 if ! [[ $valueOfCheck =~ $re ]]; then echo "error: Not a number" ; exit 1 elif [ $valueOfCheck -gt 0 ]; then echo "That's a number"; functionX fi |
çıktımız
1 2 3 4 5 6 7 8 9 |
+ re='^[0-9]+$' + valueOfCheck=5 + [[ 5 =~ ^[0-9]+$ ]] + '[' 5 -gt 0 ']' + echo 'That'\''s a number' That's a number + functionX deneme.sh: line 9: functionX: command not found + set +x |
şeklinde olucak ve sıkıntı çıkaran syntax hatalarınıda kolaylıkla görebileceğiz.
Şu an pek fazla işe yaramıyormuş gibi gözüksede o if’ler çoğaldığında set’in yanına ne koyuyorduk diye soracağınızdan eminim :). Bu işin fıtratındada bu var herkese kolay gelsin.
Bu arada önemli not Emacs sh-mode ile sıkıntılı satırlara gidebiliyoruz diyeyim. 1970 senelerinden kalma editörümüze selam olsun. Daha güzel yöntemler var ise yazarsanız sevinirim.
Daha fazla bilgi için:
http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html
Buralarada işiniz düşebilir
Edit 1: Eclipse’te ShellEd diye bir eklentide buldum gayet güzele benziyor isteyenler onuda deneyebilir.