Trabalhando em algumas funções do bash, eu não sabia o source ...
comando, então usei eval $(cat ...)
. Agora, estou me perguntando: se devo alterar todos os usos disso ou é apenas a mesma função?
Eles parecem funcionar da mesma forma agora, mas talvez haja algumas diferenças enganosas mais tarde, eu só quero saber.
command-line
bash
Benjamin
fonte
fonte
eval "$(cat file)"
source
, pois é um comando feito especificamente para isso.Como já mencionado por @glennjackman, convém citar a substituição de comando, caso contrário, 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.
Quando você cria um script, várias variáveis especiais do shell serão modificadas, principalmente as matrizes
BASH_SOURCE
,BASH_LINENO
eFUNCNAME
. Estes são úteis para imprimir mensagens de erro e depuração.Você pode retornar de um script de origem com o
return
comando (help return
). Com a avaliação, você não terá esse efeito. Da mesma forma, uma armadilha RETURN não será acionada para a avaliação.Ao adquirir um script, você pode passar argumentos para ele. Você não pode fazer isso com essa avaliação.
Com o eval, a substituição do comando lê todo o conteúdo do arquivo na memória antes de passá-lo para o eval. Quando você o origina, o bash lê o arquivo à medida que avança.
fonte
Há um bom resumo de qual fonte, eval e exec fazem aqui: http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html
Eu acho que o uso de eval e source'ing no arquivo fará a mesma coisa. Não tenho certeza absoluta, porém, de que variáveis dentro do subscrito se comportarão da mesma maneira em qualquer caso. Eu recomendo o uso da fonte, se possível, porque é o caminho mais direto a seguir e torna seu código mais legível.
fonte
$(cat file)
->$(< file)