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

7

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

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

    
задан Benjamin 11.08.2012 в 20:36
источник

3 ответа

4

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

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

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

cat<<EOF
a
b
c
EOF
    
ответ дан Florian Diesch 11.08.2012 в 21:27
источник
8

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

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

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

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

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

ответ дан geirha 12.08.2012 в 03:11
источник
1

Есть хорошее резюме того, что источник, eval и exec делают здесь: Ссылка

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

ответ дан Hinz 11.08.2012 в 20:59
источник

Ознакомьтесь с другими вопросами по меткам