Simplesmente mude para atribuição primeiro e depois eval.
Exemplo 1 (parar se o comando de entrada for inválido):
[xiaobai@localhost ~]$ cat h2.sh
#!/bin/bash
trap err_handler ERR
err_handler() { echo trapped ; exit; }
e2=$(echoasasas)
eval "$e2"
echo "next"
[xiaobai@localhost ~]$ sh h2.sh
h2.sh: line 5: echoasasas: command not found
trapped
[xiaobai@localhost ~]$
Exemplo 2 (parar se a saída não for um comando válido):
[xiaobai@localhost ~]$ cat h2.sh
#!/bin/bash
trap err_handler ERR
err_handler() { echo trapped ; exit; }
e2=$(echo xxxxx)
eval "$e2"
echo "next"
[xiaobai@localhost ~]$ sh h2.sh
h2.sh: line 6: xxxxx: command not found
trapped
[xiaobai@localhost ~]$
Exemplo 3 (continue a executar o próximo comando):
[xiaobai@localhost ~]$ cat h2.sh
#!/bin/bash
trap err_handler ERR
err_handler() { echo trapped ; exit; }
e2=$(echo ls)
eval "$e2"
echo "next"
[xiaobai@localhost ~]$ sh h2.sh
Android CRITICAL Documents
next
[xiaobai@localhost ~]$
Exemplo 4 (metade se STDERR é acionado em outro shell):
[xiaobai@localhost ~]$ cat /tmp/so.sh
ls yyyyyy 2>/tmp/kas
[xiaobai@localhost ~]$ cat /tmp/kas
[xiaobai@localhost ~]$ cat h2.sh
#!/bin/bash
trap err_handler ERR
err_handler() { echo trapped ; exit; }
echo "before"
e2=$(/bin/bash /tmp/so.sh)
eval "$e2"
echo "next"
[xiaobai@localhost ~]$ sh h2.sh
before
trapped
[xiaobai@localhost ~]$ cat /tmp/kas
ls: cannot access 'yyyyyy': No such file or directory
[xiaobai@localhost ~]$