다음 트랩 출력에 대해 설명해주세요.
$ 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
명령 대체 서브셸이 트랩 구성을 상속한다고 주장하는데(실제로 이를 따르지 않는다는 점을 제외하고) 다르게 동작하는 이유는 무엇입니까?
답변1
흥미로운. 이는 Bash 관련 동작인 것 같습니다.
나는 3개의 다른 POSIX 호환 쉘(zsh, dash, busybox)을 시도했고 모두 echo "$(trap)"
동일한 결과를 얻었습니다 (trap)
. 하위 쉘이 실행되었고 하위 쉘에 트랩이 표시되지 않았습니다 EXIT
.
(이것은 trap -p
Bash에만 해당되며 추가 인수가 없으면 인수 없이와 동일한 작업을 수행합니다 trap
.)
Bash 동작이 유용할 수 있습니다.: 즉, a="$(trap)"
상위 쉘을 캡처하는 트랩 설정을 작성할 수 있으며 이는 더 흥미로울 수 있습니다.
그러나 서브쉘에서 트랩을 설정하거나 지우면~ 할 것이다상위 셸 대신 하위 셸에 대한 트랩을 나열합니다.
$ trap 'echo bye' EXIT
$ echo "$(trap TERM; trap)" # explicitly clear TERM, but leave EXIT alone
trap -- '' SIGTSTP
trap -- '' SIGTTIN
trap -- '' SIGTTOU
따라서 서브쉘의 함정에 관심이 있는 드문 경우도 다루고 있습니다.
전반적으로, 나는 Bash 개발자들이 서브쉘 처리가 잘 작동하도록 하기 위해 약간의 추가 노력을 기울이는 것 같다는 것을 알았습니다. 또한 간단한 POSIX 셸을 사용하는 것보다 Bash를 사용하여 백그라운드 하위 프로세스를 관리하는 것이 더 쉽습니다.