Bash: emitindo a armadilha duas vezes

4

Eu tenho uma pergunta muito simples. Eu não posso acreditar que a manpage do Bash não explica isso, mas de qualquer forma ...

Se eu emitir o trap incorporado duas vezes [para o mesmo sinal], o que acontece? O segundo comando é adicionado ao o primeiro, ou substitui o primeiro?

trap Foo SIGINT
...
trap Bar SIGINT
...

Quando o SIGINT acontece, o Bash apenas executa Bar ou também executa Foo ? Ou algo mais ...?

    
por MathematicalOrchid 28.11.2014 / 10:47

3 respostas

5

O comando é substituído.

A página manpage afirma:

 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.

Ele indica the command arg is to be read and executed ... period. Caso contrário, não seria possível redefinir o tratamento do sinal se o argumento fosse sempre adicionado à lista.

    
por 28.11.2014 / 10:55
4

No manual :

trap [-lp] [arg] [sigspec …]

The commands in arg are to be read and executed when the shell receives signal sigspec.

A descrição não diz nada sobre a adição a uma lista existente de comandos. Ele continua especificando efeitos não-incrementais quando arg está vazio ou a string - . Enquanto o texto não pode explicitamente dizer que os comandos não são adicionados a uma lista, ele nunca menciona qualquer lista, ou qualquer meio de remover um item da referida lista. Portanto, interpretar este texto de uma forma que implicaria que os comandos trap sucessivos que adicionam arg a uma lista são bastante improváveis.

Você pode verificar lendo o manual de outro shell. Se a bash se desviasse do comportamento usual, o manual diria claramente. O padrão POSIX não é ambíguo no assunto:

The action of trap shall override a previous action (either default action or one explicitly set).

    
por 29.11.2014 / 23:51
0

Ainda não consigo encontrar nenhuma documentação sobre o assunto, mas nos meus testes aparece que a segunda especificação trap substitui totalmente a primeira. (Por exemplo, Bar será executado, mas Foo não será.)

    
por 28.11.2014 / 10:54

Tags