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"; pwdlista o conteúdo de/somewhere/elsee imprime/somewhere/else. -
cd /starting/directory; foo=/somewhere/else; (eval "$1"); pwdlista o conteúdo de/somewhere/elsee imprime/starting/directory. -
cd /starting/directory; foo=/somewhere/else; bash -c "$1"; pwdlista o conteúdo de/starting/directory(porquecd ""não altera o diretório atual) e imprime/starting/directory.