Diyelim ki bir EXITtuzak 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 myfuncbir alt kabukta çalıştırılır ... ve alt kabuklar trapebeveynin 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 mytrapalt 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, mytrapalt 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ı:
trapayarlar alt kabuklar tarafından devralınmadı- bir alt kabuktan örtülü çıkış bir
EXITtuzağı tetikliyor gibi görünmüyor