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.