Является ли eval $ (имя файла cat) тем же, что и имя исходного файла?

Работая над некоторыми функциями bash, я не знал команду source ..., поэтому вместо этого использовал eval $(cat ...). Теперь мне интересно, стоит ли мне менять каждое использование этого или это просто одна и та же функция?

Теперь они работают одинаково, но, возможно, позже будут некоторые вводящие в заблуждение различия, я просто хочу знаю.

8
задан 12 August 2012 в 00:42

3 ответа

eval $(cat ...) работает не во всех случаях. Например, разрывы строк преобразуются в один пробел с помощью $(cat ...) перед обработкой содержимого с помощью eval. Это часто нарушает многострочные операторы, такие как циклы и здесь документы.

Попробуйте, например, следующий файл с обоими методами:

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

cat<<EOF
a
b
c
EOF
0
ответ дан 12 August 2012 в 00:42

Хорошее резюме того, что делают source, eval и exec: http://www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking- help-clear.html

Я думаю, что использование eval и source'ing для файла сделает то же самое. Я не совсем уверен, однако, что переменные внутри индекса будут вести себя одинаково в любом случае. Я бы порекомендовал использовать исходный код, если это возможно, потому что это более простой способ сделать ваш код более читабельным.

0
ответ дан 12 August 2012 в 00:42

Как уже упоминалось @glennjackman, вы захотите заключить в кавычки подстановку команд, иначе разделение слов и расширение имени пути изменят содержимое до того, как оно будет удалено. И хотя обе команды будут выполнять команды из файла, существуют различия.

  • При создании сценария будут изменены различные специальные переменные оболочки, в основном массивы BASH_SOURCE, BASH_LINENO и FUNCNAME. Они полезны для печати сообщений об ошибках и отладки.

  • Вы можете вернуться из исходного сценария с помощью команды return (help return). С eval вы не получите такой эффект. И точно так же ловушка ВОЗВРАТА не сработает для eval.

  • При поиске сценария вы можете передать ему аргументы. Вы не можете сделать это с этим eval.

  • С помощью eval команда подстановки будет считывать все содержимое файла в память перед передачей его в eval. Когда вы его загрузите, bash будет читать из файла по ходу дела.

0
ответ дан 12 August 2012 в 00:42

Другие вопросы по тегам:

Похожие вопросы: