Esqueci-me desta questão. Eu contribuí com uma correção para atacar em 2016 :
4/22
----
builtins/evalstring.c
- should_suppress_fork: don't suppress the fork if there are any traps
set, since that requires that we hang around to react to a signal or
collect the command's exit status and run something. Fixes bug
reported by Brian Vandenberg
Como especulei na minha pergunta, bash realmente tem otimizações no lugar. Já faz algum tempo desde que eu olhei para o código, mas mais ou menos faz o seguinte:
- Analise até que uma expressão completa seja identificada, avalie-a e interprete ou execute o que resta após a avaliação
- Repetir (1) até restar apenas uma expressão
- Se a última expressão não precisar de assistência do shell e puder ser passada para uma função
exec()
family, faça isso
Minha correção foi adicionar à definição de "não requer assistência do shell", fazendo com que verifique se há armadilhas em vigor.