eval "$1"
executa o comando no script atual. Ele pode definir e usar variáveis de shell a partir do script atual, definir variáveis de ambiente para o script atual, definir e usar funções do script atual, definir o diretório atual, umask, limites e outros atributos para o script atual e assim por diante. bash -c "$1"
executa o comando em um script completamente separado, que herda variáveis de ambiente, descritores de arquivo e outro ambiente de processo (mas não transmite nenhuma alteração), mas não herda as configurações internas do shell (variáveis de shell, funções, opções, traps, etc) .).
Existe outra maneira, (eval "$1")
, que executa o comando em um subshell: ele herda tudo do script de chamada, mas não transmite nenhuma alteração de volta.
Por exemplo, supondo que a variável dir
não seja exportada e $1
seja cd "$foo"; ls
, então:
-
cd /starting/directory; foo=/somewhere/else; eval "$1"; pwd
lista o conteúdo de/somewhere/else
e imprime/somewhere/else
. -
cd /starting/directory; foo=/somewhere/else; (eval "$1"); pwd
lista o conteúdo de/somewhere/else
e imprime/starting/directory
. -
cd /starting/directory; foo=/somewhere/else; bash -c "$1"; pwd
lista o conteúdo de/starting/directory
(porquecd ""
não altera o diretório atual) e imprime/starting/directory
.