O eval $ (nome do arquivo cat) é igual ao nome do arquivo de origem?

7

Trabalhando em algumas funções bash, eu não sabia o comando source ... , então usei eval $(cat ...) . Agora eu estou querendo saber, se devo mudar cada uso disso, ou é apenas a mesma função?

Eles parecem funcionar da mesma forma agora, mas talvez haja algumas diferenças enganosas depois, eu só quero saber.

    
por Benjamin 11.08.2012 / 22:36

3 respostas

4

eval $(cat ...) não funciona em todos os casos. Por exemplo, as quebras de linha são convertidas em um único espaço em $(cat ...) antes que o conteúdo seja processado por eval . Isso geralmente quebra instruções de várias linhas, como loops e documentos aqui.

Tente, por exemplo, o seguinte arquivo com os dois métodos:

for i in 1 2 3; do
 echo $i
done

cat<<EOF
a
b
c
EOF
    
por Florian Diesch 11.08.2012 / 23:27
8

Como já foi mencionado por @glennjackman, você vai querer citar a substituição de comandos, senão a divisão de palavras e a expansão do nome do caminho modificarão o conteúdo antes que ele seja avaliado. E enquanto ambos executam os comandos do arquivo, existem diferenças.

  • Ao criar um script, várias variáveis especiais do shell serão modificadas, principalmente as matrizes BASH_SOURCE , BASH_LINENO e FUNCNAME . Estes são úteis para imprimir mensagens de erro e depuração.

  • Você pode retornar de um script de origem com o comando return ( help return ). Com o eval, você não terá esse efeito. E da mesma forma uma armadilha RETURN não será acionada para o eval.

  • Ao pesquisar um script, você pode passar argumentos para ele. Você não pode fazer isso com esse eval.

  • Com o eval, a substituição do comando lerá todo o conteúdo do arquivo na memória antes de passá-lo para eval. Quando você obtê-lo, o bash irá ler o arquivo como ele vai.

por geirha 12.08.2012 / 05:11
1

Há um bom resumo do que a fonte, o eval e o exec fazem aqui: link

Eu acho que o uso de eval e a origem do arquivo farão o mesmo. Não estou completamente certo, no entanto, que as variáveis dentro do subscrito se comportarão da mesma forma em qualquer caso. Eu recomendo usar fonte, se possível, porque é a maneira mais simples de ir e faz seu código mais legível.

    
por Hinz 11.08.2012 / 22:59