[동일한 신호에 대해] 내장 명령을 두 번 실행 하면 trap
어떻게 되나요 ? 두 번째 명령이다에 추가하다첫 번째는 아직이에요바꾸다첫 번째?
trap Foo SIGINT
...
trap Bar SIGINT
...
SIGINT가 발생하면 Bash만 실행되나요, 아니면 Bash도 Bar
실행되나요? Foo
아니면 다른 것인가요...?
답변1
명령이 대체됩니다.
맨페이지에는 다음과 같이 명시되어 있습니다.
trap [-lp] [[arg] sigspec ...]
The command arg is to be read and executed when the shell
receives signal(s) sigspec. If arg is absent (and there is a
single sigspec) or -, each specified signal is reset to its
original disposition (the value it had upon entrance to the
shell). If arg is the null string the signal specified by each
sigspec is ignored by the shell and by the commands it invokes.
If arg is not present and -p has been supplied, then the trap
commands associated with each sigspec are displayed. If no
arguments are supplied or if only -p is given, trap prints the
list of commands associated with each signal. The -l option
causes the shell to print a list of signal names and their cor‐
responding numbers. Each sigspec is either a signal name
defined in <signal.h>, or a signal number. Signal names are
case insensitive and the SIG prefix is optional.
the command arg is to be read and executed ...
기간을 표시한 것입니다 . 그렇지 않으면 arg가 항상 목록에 추가되면 신호 처리를 재설정할 수 없습니다.
답변2
~에서수동:
trap [-lp] [arg] [sigspec …]
명령을 내리다아르기닌쉘이 신호를 수신하면 읽고 실행됩니다.신호 사양.
설명에는 기존 명령 목록에 추가하는 방법에 대한 언급이 없습니다. 계속해서 비증분 효과를 지정합니다.아르기닌비어 있거나 문자열입니다 -
. 텍스트에는 명령이 목록에 추가되지 않는다고 명시적으로 명시되어 있지 않을 수 있지만 그러한 목록이나 해당 목록에서 항목을 제거하는 방법은 언급되지 않습니다. 따라서 trap
이 텍스트를 연속적인 명령이 목록에 추가되는 방식으로 해석하는 것은 arg
상당히 무리한 일입니다 .
다른 셸의 설명서를 확인하여 이를 확인할 수 있습니다. Bash가 일반적인 동작에서 벗어나면 매뉴얼에서 이를 명확하게 설명합니다. 이것POSIX 표준이 문제에 대해서는 분명합니다.
행동덫이전 작업(기본 작업 또는 명시적으로 설정된 작업)을 재정의해야 합니다.
답변3
아직도 찾을 수가 없어요문서질문에 관해서는 내 테스트에서나타나다두 번째 trap
사양은 첫 번째 사양을 완전히 대체합니다. (즉, Bar
실행되지만 Foo
실행되지는 않습니다.)
답변4
이미 답변한 대로 트랩 명령은 기존 트랩을 대체합니다. 현재 버전과 새 버전을 모두 실행하려면 약간 수정하면 됩니다.
function overtrap {
trap="$1"
sig=$(echo $2 | tr [a-z] [A-Z])
cur="$(trap -p $sig | sed -nr "s/trap -- '(.*)' $sig\$/\1/p")"
if test ${cur:+x}; then
trap "{ $trap; }; $cur" $sig
else
trap "$trap" $sig
fi
}
다음과 같이 전화하십시오.
overtrap 'echo hi' exit
overtrap 'echo ho' exit
인쇄됩니다
ho
hi
(하지만 휴대성이 좋은지는 잘 모르겠습니다.)