Xử lý bẫy và các chuỗi con ẩn trong tập lệnh shell


12

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 EXITcá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 traphà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 mytrapkhi 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, mytrapsẽ 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

Câu trả lời:


8

Nội dung bash trapcho phép từ khóa RETURN. Do đó thay đổi:

trap mytrap EXIT

đến:

trap mytrap RETURN

Xem thảo luận về traptrong vỏ builtins

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.