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.