#!/bin/sh --
for set_trap_sig in HUP INT QUIT ALRM TERM; do
trap -- '
trap -- - '"${set_trap_sig:?}"' EXIT || exit "$?"
kill -s '"${set_trap_sig:?}"' -- "$$" || exit "$?"' "$set_trap_sig"
done
sleep 15 || exit "$?"
Aqui está o que acontece quando eu envio SIGINT para o script
user@hostname:/tmp$ ./script.sh
^C./script.sh: 3: ./script.sh: Syntax error: EOF in backquote substitution
Este problema parece específico para dash. No ash, bash e ksh93, não recebo esse erro. Isso é particularmente estranho porque meu script nem contém o caractere backquote.
Se eu remover as aspas duplas no final $?
da linha 5, o erro desaparece.
Estou fazendo algo estúpido ou o Dash está sendo retardado? E sim, eu sei que escrevo roteiros como um esquizofrênico paranóico.
Edit: estabelecemos um bug muito sério que afeta até as versões modernas do Ubuntu e do Debian. Alguém sabe de uma solução alternativa?
Aqui está um caso de teste simplificado:
Modificar o comprimento ou o conteúdo do código citado pode "consertar" o bug ou produzir corrupções diferentes e interessantes, com bytes aleatórios aparecendo do nada.
Isso foi causado por um bug use-after-free que foi corrigido desde o dash 0.5.9, mas que ainda está presente no dash 0.5.8 do Debian 9.8 estável (stretch), Ubuntu 18.04 (biônico) e Ubuntu 18.10 (cósmico) .
Este é o commit que o corrigiu:
Uma solução alternativa é colocar o manipulador de trap em uma função -- para que nenhum comando seja executado após a desativação da trap, tente usar a string de ação depois que ela for liberada: