Travaillant sur certaines fonctions bash, je ne connaissais pas la source ...
commande, j'ai donc utilisé à la eval $(cat ...)
place. Maintenant, je me demande si je devrais changer chaque utilisation ou est-ce juste la même fonction?
Ils semblent fonctionner de la même façon maintenant, mais il y aura peut-être des différences trompeuses plus tard, je veux juste savoir.
command-line
bash
Benjamin
la source
la source
eval "$(cat file)"
source
car c'est une commande spécialement conçue pour cela.Comme déjà mentionné par @glennjackman, vous voudrez citer la substitution de commande, sinon le fractionnement de mots et l'expansion du nom de chemin modifieront le contenu avant qu'il ne soit évalué. Et bien que les deux exécutent les commandes à partir du fichier, il existe des différences.
Lorsque vous source d' un script, diverses variables shell spéciaux seront modifiés, principalement
BASH_SOURCE
,BASH_LINENO
et desFUNCNAME
tableaux. Ils sont utiles pour imprimer des messages d'erreur et déboguer.Vous pouvez revenir d'un script d'origine avec la
return
commande (help return
). Avec l'eval, vous n'obtiendrez pas cet effet. De même, un piège RETOUR ne sera pas déclenché pour l'évaluation.Lorsque vous sourcez un script, vous pouvez lui passer des arguments. Vous ne pouvez pas faire ça avec cet eval.
Avec l'eval, la substitution de commande lira tout le contenu du fichier en mémoire avant de le transmettre à eval. Lorsque vous le sourcez, bash lira le fichier au fur et à mesure.
la source
Il y a un bon résumé de ce que font source, eval et exec ici: http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html
Je pense que votre utilisation de eval et de la source du fichier fera la même chose. Je ne suis pas complètement sûr, cependant, que les variables à l'intérieur de l'indice se comporteront de la même façon dans tous les cas. Je recommanderais d'utiliser la source si possible, car c'est la façon la plus simple d'aller et rend votre code plus lisible.
la source
$(cat file)
->$(< file)