trap
không được hỗ trợ cho các lớp con nhưng một số cách cho phép lớp con báo cáo các bẫy của lớp vỏ mẹ và các cách khác thì không. Tôi đã làm một số thử nghiệm trên macos với bash.
GNU bash, phiên bản 4.4.12 (1) -release (x86_64-apple-darwin16.3.0):
trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap | cat # trap -- 'echo hello' EXIT
(trap) | cat # trap -- 'echo hello' EXIT
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # trap -- 'echo hello' EXIT
GNU bash, phiên bản 3.2.57 (1) -release (x86_64-apple-darwin16):
trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap > >(cat) # trap -- 'echo hello' EXIT
trap | cat # empty
(trap) | cat # empty
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # empty
Điều này là tốt để biết rằng trap_output="$(trap)"
sẽ làm việc để nắm bắt đầu ra bẫy. Tôi không thể nghĩ ra cách nào khác để làm điều đó nếu điều đó không hiệu quả ngoài việc thực hiện trap >trap_output_file
để xuất nó thành một tệp (fifo sẽ không hoạt động bash 3.2.57
) và sau đó đọc lại bằngtrap_output="$(<trap_output_file)"
fifo sẽ không làm việc bash 3.2.57
vì trap &
trống rỗng bash 3.2.57
nhưng khôngbash 4.4.12
GNU bash, phiên bản 4.4.12 (1) -release (x86_64-apple-darwin16.3.0):
mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# trap -- 'echo hello' EXIT
mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell
GNU bash, phiên bản 3.2.57 (1) -release (x86_64-apple-darwin16):
mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# empty because trap >/tmp/fifo & is empty since it uses trap &
mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell