Работая над некоторыми функциями bash, я не знал команду source ...
, поэтому вместо этого использовал eval $(cat ...)
. Теперь мне интересно, стоит ли мне менять каждое использование этого или это просто одна и та же функция?
Теперь они работают одинаково, но, возможно, позже будут некоторые вводящие в заблуждение различия, я просто хочу знаю.
eval $(cat ...)
работает не во всех случаях. Например, разрывы строк преобразуются в один пробел с помощью $(cat ...)
перед обработкой содержимого с помощью eval
. Это часто нарушает многострочные операторы, такие как циклы и здесь документы.
Попробуйте, например, следующий файл с обоими методами:
for i in 1 2 3; do
echo $i
done
cat<<EOF
a
b
c
EOF
Хорошее резюме того, что делают source, eval и exec: http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking- help-clear.html
Я думаю, что использование eval и source'ing для файла сделает то же самое. Я не совсем уверен, однако, что переменные внутри индекса будут вести себя одинаково в любом случае. Я бы порекомендовал использовать исходный код, если это возможно, потому что это более простой способ сделать ваш код более читабельным.
Как уже упоминалось @glennjackman, вы захотите заключить в кавычки подстановку команд, иначе разделение слов и расширение имени пути изменят содержимое до того, как оно будет удалено. И хотя обе команды будут выполнять команды из файла, существуют различия.
При создании сценария будут изменены различные специальные переменные оболочки, в основном массивы BASH_SOURCE
, BASH_LINENO
и FUNCNAME
. Они полезны для печати сообщений об ошибках и отладки.
Вы можете вернуться из исходного сценария с помощью команды return
(help return
). С eval вы не получите такой эффект. И точно так же ловушка ВОЗВРАТА не сработает для eval.
При поиске сценария вы можете передать ему аргументы. Вы не можете сделать это с этим eval.
С помощью eval команда подстановки будет считывать все содержимое файла в память перед передачей его в eval. Когда вы его загрузите, bash будет читать из файла по ходу дела.