O que o eval
efetivamente faz é analisar os argumentos, expandir as variáveis etc etc e, em seguida, a sequência resultante é executada normalmente.
Então, por exemplo:
$ i=ls
$ eval $i
O eval
aqui substituirá $i
por ls
e então executará o comando ls
como normal (assim será fork()
/ exec()
para executar o ls
process).
Se, no entanto, você fez
$ i="echo hello"
$ eval $i
hello
nenhum novo processo é criado porque o echo hello
é executado como um arquivo interno.
Nós podemos ver que nenhum shell é criado configurando variáveis:
$ a=0
$ i="a=100"
$ eval $i
$ echo $a
100
$a
só poderia ser definido para 100 se isso fosse feito no shell atual.
Portanto, o eval
em si é realmente apenas um analisador e é feito no shell atual; os resultados dessa cadeia podem ou não criar um novo processo, da mesma forma que qualquer outro comando.