trap
부분의대시 맨페이지성명은 다음과 같습니다 :
덫인수를 취하지 않으면 신호 목록과 관련 작업이 특정 형식으로 표준 출력에 기록됩니다.동일한 캡처 결과를 얻기 위한 셸 입력으로 적합.
놀라운! 나는 trap
이 출력을 명령으로 셸에 다시 공급하여 덮어쓴 이전 신호 처리기를 복원하는 쉬운 방법을 찾은 것 같습니다 .
trap "echo 'good'" EXIT
# save signal handlers to $traps
traps="$(trap)"
# override EXIT handler
trap "echo 'bad'" EXIT
# reinstate original handlers
eval "$traps"
원하는 출력:good
실제 출력:bad
이는 비어 있기 때문에 완전히 논리적이며 $traps
맨페이지와도 일치합니다.
쉘이 하위 쉘에서 분기되면 캡처된(무시되지는 않음) 신호를 기본 작업으로 재설정합니다.
(명령 대체는 $(trap)
서브쉘을 분기하므로 trap
신호 처리기에 대해 알지 못합니다.)
모든 것이 제대로 작동하는 것 같습니다. 그런데 trap
목록 기능을 어떻게 활용하나요 ?
답변1
임시 파일로 리디렉션할 수 있습니다.
file=$(mktemp) || exit
{
rm -f -- "$file"
trap
traps=$(cat)
} > "$file" < "$file"
이와 관련하여 POSIX가 아닙니다 dash
.trap
POSIX에는 다음이 필요합니다.저것:
var=$(trap)
트랩이 서브쉘에서 재설정되지 않는 특별한 경우로 간주됩니다.
zsh
그리고 mksh
이런 문제도 있습니다. 그러나 zsh
다음을 수행할 수 있습니다.
trap | IFS= read -rd '' traps