Subshell tiêu chuẩn vs subshell thay thế lệnh


8

Vui lòng giải thích các đầu ra bẫy này:

$ line(){ echo -------------; echo $BASHPID; }
$ trap 'echo bye' EXIT; trap -p; line; (trap -p; line); echo "$(trap -p; line)"

trap -- 'echo bye' EXIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6176
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6178
trap -- 'echo bye' EXIT
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
-------------
6180

Tại sao lớp con thay thế lệnh lại hành xử khác ở chỗ nó tuyên bố đã thừa hưởng các cách xử lý bẫy (ngoại trừ việc nó không thực sự tuân theo chúng)?

Câu trả lời:


2

Hấp dẫn. Điều này dường như là hành vi cụ thể của Bash.

Tôi đã thử 3 shell tương thích POSIX khác (zsh, dash, busybox) và trong tất cả chúng đều echo "$(trap)"cho kết quả giống như (trap): một lớp con được chạy và lớp vỏ con không hiển thị EXITbẫy.

(Lưu ý trap -plà dành riêng cho Bash và không có tham số bổ sung, nó sẽ thực hiện tương tự như trapkhông có tham số.)

Hành vi của Bash có khả năng hữu ích : nó có nghĩa là bạn có thể viết a="$(trap)"để nắm bắt các cài đặt bẫy của shell cha, có khả năng thú vị hơn.

Tuy nhiên, nếu bạn đặt hoặc xóa bẫy trong khung con, thì nó sẽ liệt kê các bẫy của vỏ con thay vì bẫy của bố mẹ:

$ trap 'echo bye' EXIT
$ echo "$(trap TERM; trap)"  # explicitly clear TERM, but leave EXIT alone
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU

Vì vậy, họ cũng đã đề cập đến trường hợp hiếm hoi mà bạn quan tâm đến bẫy của subshell.

Nói chung, tôi nhận thấy rằng các nhà phát triển Bash dường như đã nỗ lực thêm để làm cho việc xử lý lớp vỏ hoạt động tốt. Việc quản lý các quy trình nền với Bash cũng dễ dàng hơn rất nhiều so với các trình bao POSIX tối thiểu hơn.

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.