Diyelim ki bir EXIT
tuzak yoluyla bir çeşit temizleme kodu çalıştıran bir kabuk betiğiniz var , şöyle:
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
trap mytrap exit
echo I am at the end of the script.
Bu, beklendiği gibi It's a trap!
, komut dosyası çıktığında yazdırılır :
$ sh myscript
I am at the end of the script.
It's a trap!
Komut dosyasını, sonuçta başka bir komuta pipetlenen bazı çıktılar üreten bir işlev eklemek için değiştirin, örneğin:
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
myfunc () {
echo "I've got a bad feeling about this..."
}
trap mytrap exit
myfunc | cat > /dev/null
echo I am at the end of the script.
Boru nedeniyle, kod myfunc
bir alt kabukta çalıştırılır ... ve alt kabuklar trap
ebeveynin davranışını miras almaz gibi görünür , yani burada kazandıran tuzak kodunuz tarafından temizlenmesi gereken herhangi bir işlem yaparsanız Olmaz.
Yani şunu deneyin:
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
}
Ve mytrap
alt kabuk çıktığında hala tetiklenemiyor . Açık bir şekilde ihtiyacınız olduğu ortaya çıktı, exit
şöyle:
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
exit
}
Yukarıdaki kodla, mytrap
alt kabuktan çıkıldığında uygun şekilde tetiklenir:
$ sh myscript
It's a trap!
I am at the end of the script.
It's a trap!
Bu beklenen davranış mı? Burada birkaç şey beni şaşırttı:
trap
ayarlar alt kabuklar tarafından devralınmadı- bir alt kabuktan örtülü çıkış bir
EXIT
tuzağı tetikliyor gibi görünmüyor