Giả sử bạn có một tập lệnh shell chạy một số loại mã dọn dẹp thông qua một EXIT
cái bẫy, như thế này:
#!/bin/bash
mytrap () {
echo "It's a trap!" >&2
}
trap mytrap exit
echo I am at the end of the script.
Điều này sẽ, như mong đợi, in ra It's a trap!
khi tập lệnh thoát:
$ sh myscript
I am at the end of the script.
It's a trap!
Bạn sửa đổi tập lệnh để thêm một hàm tạo ra một số đầu ra mà cuối cùng được chuyển sang một lệnh khác, như sau:
#!/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.
Do đường ống, mã trong myfunc
được chạy trong một mạng con ... và các mạng con dường như không kế thừa trap
hành vi của cha mẹ, điều đó có nghĩa là nếu bạn thực hiện bất kỳ hành động nào ở đây cần được dọn sạch bằng mã bẫy của bạn sẽ thắng ' t xảy ra
Vì vậy, bạn hãy thử điều này:
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
}
Và nó vẫn không kích hoạt mytrap
khi thoát khỏi subshell. Nó chỉ ra rằng bạn cần một rõ ràng exit
, như thế này:
myfunc () {
trap mytrap EXIT
echo "I've got a bad feeling about this..."
exit
}
Với đoạn mã trên, mytrap
sẽ kích hoạt một cách thích hợp khi thoát khỏi lớp con:
$ sh myscript
It's a trap!
I am at the end of the script.
It's a trap!
Đó có phải là hành vi dự kiến? Tôi đã ngạc nhiên bởi một số điều ở đây:
trap
cài đặt không được kế thừa bởi các lớp con- lối thoát ngầm từ một lớp con không xuất hiện để kích hoạt
EXIT
bẫy