Restaurar armadilhas sem um arquivo temporário
-
09-12-2019 - |
Pergunta
Sem argumentos trap
imprime os comandos atualmente definidos para todas as armadilhas.No entanto, um subshell não herda traps, então o exemplo canônico para salvar e restaurar traps falha no bash:
save_traps=$(trap) ... eval "$save_traps"
A armadilha no RHS da atribuição é executada em um subshell, portanto save_traps é sempre a string vazia.Além de escrever a saída de trap
para um arquivo temporário, como um script pode encontrar o conjunto de comandos atual para uma armadilha?
Solução
Funciona para mim.
Crie uma armadilha de amostra:
$ trap
$ trap echo SIGIO
$ trap
trap -- 'echo' SIGIO
Armazene a armadilha em save_traps
:
$ save_traps=$(trap)
Remover:
$ trap SIGIO
$ trap | wc -l
0
Restaurar:
$ eval "$save_traps"
$ trap
trap -- 'echo' SIGIO
Testado com:
$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin12)
Copyright (C) 2007 Free Software Foundation, Inc.
Outras dicas
Embora a página de manual do Bash pareça dizer que as armadilhas são redefinidas em subshells e a substituição de comandos é executada em um subshell, executando trap
dentro $()
funciona de qualquer maneira (testado no Bash 3.2 e 4.2).Também é mencionado no POSIX que traps=$(trap)
Deveria trabalhar.
Graças a pgas
em #bash
no irc.freenode.net
.