Diferença entre 'trap -⁠- EXIT' e 'trap - EXIT'

4

Tenho notado que, quando o Bash é chamado como sh , você não pode remover o trapping usando, por exemplo, trap -- EXIT , mas quando ele é chamado de bash , você pode.

trap - EXIT parece funcionar independentemente de como o shell foi chamado.

Exemplo de saída:

[vagrant@localhost ~]$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar  9  2016 /bin/sh -> bash
[vagrant@localhost ~]$ sh
sh-4.1$ trap 'echo something' EXIT
sh-4.1$ exit
exit
something
[vagrant@localhost ~]$ sh
sh-4.1$ trap 'echo something' EXIT
sh-4.1$ trap -- EXIT
trap: usage: trap [-lp] [[arg] signal_spec ...]
sh-4.1$ trap - EXIT
sh-4.1$ exit
exit
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ exit
exit
something
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ trap -- EXIT
[vagrant@localhost ~]$ exit
exit
[vagrant@localhost ~]$ bash
[vagrant@localhost ~]$ trap 'echo something' EXIT
[vagrant@localhost ~]$ trap - EXIT
[vagrant@localhost ~]$ exit
exit
[vagrant@localhost ~]$ 

Eu verifiquei a documentação, mas não vejo a diferença elucidada em lugar algum. Eu faço ver que o formulário de hífen único especificado por POSIX .

Existe alguma diferença no comportamento entre os dois métodos de desativação de um trap, além de -- não funcionar em sh ?

    
por Wildcard 07.01.2017 / 07:01

1 resposta

7

Isso é explicado alguns na página de manual da armadilha (1P) e mais em o Guia avançado de scripts de bash , que explica que o -- é um Bash built-in, usado para denotar o "fim de opções" para um comando. Como os scripts que usam sh são projetados para serem portáveis entre outros sistemas com ele, o bash se comporta como se fosse executado com --posix , o que altera algum comportamento do shell para corresponder à especificação POSIX.

Quando um sinal é "preso", (por exemplo, EXIT ), ele liga o primeiro argumento após o comando ao sinal, eval -ing quando o sinal é emitido e ignorando seu comportamento normal (exceto para EXIT ). Então, quando trap 'echo something' EXIT for executado, então exit , o shell irá eval 'echo something' antes de sair. Isso também funcionaria com um sinal diferente, como TERM , que poderia ser associado, por exemplo, a uma função de saída elegante em um script. Quando trap -- EXIT é executado, o -- é interpretado como um "fim de argumentos", indicando a trap que o sinal deve ser associado a nulo ( '' ) (já que não havia sinalizadores antes ou depois -- ), indicando ao shell para ignorar o sinal (no entanto, isso não funciona com EXIT, mas funciona com outros sinais). No entanto, a execução de trap -- 'echo something' EXIT continuará sendo eval 'echo something' e sairá de exit . De acordo com a especificação de trap , o comando - por si só indica que o shell irá redefinir quaisquer traps para os sinais especificados, e é por isso que funciona em sh e Bash.

    
por 07.01.2017 / 07:52