Bash: 트랩을 두 번 발행합니다.

Bash: 트랩을 두 번 발행합니다.

[동일한 신호에 대해] 내장 명령을 두 번 실행 하면 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

(하지만 휴대성이 좋은지는 잘 모르겠습니다.)

관련 정보