2012-02-10 11 views
6

Belirli bir bash komut dosyası çıktığında, normal olarak veya kesintiye uğrayıp uğramadığı, yapılması gereken bir grup genel temizleme kodum var. Bunu başarmak için trap "..." EXIT psödosignal kullanacağımı düşündüm.Bash sinyal yakalama 'trap' bloğu bildirildikten sonra değişen değişkenleri algılamıyor

Genel temizleme işlemlerine ek olarak, yalnızca komut dosyası normal olarak tamamlandığında yapılması gereken bir parça özel temizleme vardır. Ben 'tuzak' blok şöyle bir değişken sınamak alarak bu tetikleyebilecek düşündü:

#!/bin/bash 
done=false; 
trap "{   
      #generic cleanup code goes here. 
      if $done 
      then 
       #cleanup to be done only on completion goes here. 
       echo Test; 
      fi 
     }" EXIT 
#main script goes here 
done=true; 

Ancak bu işe yaramaz. Aşağıdaki kodu çalıştırmak asla "Test" e yankılanmaz. done=true;'dan sonra bir exit aramasının eklenmesi hiçbir şey değiştirmez. Neyi kaçırıyorum?

Şerefe!

cevap

13

Tuzak enterpolasyonludur ve gerçekleştirildiğinde, tuzak tanımlanırken yapılan $ değerinin değerini kullanır. Tuzak tanımının çevresindeki tek tırnakları kullanabilir veya bir işlevi tanımlayabilirsiniz. Bir fonksiyonu tanımlama muhtemelen daha temiz:

fonksiyon denir kadar fonksiyonundaki değişkenlerin genişleme yerine fonksiyon tanımlandığında daha ertelenmiş Bunun nedeni çalışır
 
#!/bin/sh 
done=false 
cleanup() { if $done; then echo Test; fi; } 
trap cleanup EXIT 
done=true 

.