dash: Como capturar saída de trap (invocados argumentos w / o)?

5

A seção sobre trap no manual do traço afirma o seguinte:

trap without any arguments cause it to write a list of signals and their associated action to the standard output in a format that is suitable as an input to the shell that achieves the same trapping results.

Impressionante! Eu achei que encontrei uma maneira fácil de restabelecer os manipuladores de sinal anteriores que eu anulei, alimentando a saída de trap de volta para o shell como um comando:

trap "echo 'good'" EXIT

# save signal handlers to $traps
traps="$(trap)"

# override EXIT handler
trap "echo 'bad'" EXIT

# reinstate original handlers
eval "$traps"

Saída desejada: good

Saída real: bad

E isso é completamente lógico porque $traps está vazio, o que é consistente com a página do manual:

When the shell forks off a subshell, it resets trapped (but not ignored) signals to the default action.

(A substituição do comando $(trap) forks de um subshell, então trap não sabe sobre nenhum manipulador de sinal.)

Tudo parece se comportar como deveria. Mas como aproveito a funcionalidade da lista trap ?

    
por Kontrollfreak 10.02.2017 / 13:08

1 resposta

4

Você pode redirecionar para um arquivo temporário:

file=$(mktemp) || exit
{
  rm -f -- "$file"
  trap
  traps=$(cat)
} > "$file" < "$file"

Observe que, nesse sentido, dash ' trap não é POSIX como POSIX não exigir que:

var=$(trap)

ser tratado como um caso especial em que as armadilhas não são redefinidas na subcamada.

zsh e mksh também têm o problema. Em zsh , no entanto, você pode fazer:

trap | IFS= read -rd '' traps
    
por 10.02.2017 / 14:08

Tags