eval $(cat文件名)是否与源文件名相同?


9

使用某些bash函数时,我不知道source ...命令,所以我eval $(cat ...)改用了。现在我想知道,我应该更改它的每次使用,还是只是相同的功能?

他们现在看起来工作相同,但是我以后只想知道,也许以后会有一些误导性的差异。

Answers:


6

eval $(cat ...)并非在所有情况下都有效。例如,$(cat ...)在将内容处理之前,将换行符转换为单个空格eval。这通常会破坏多行语句,例如循环和此处的文档。

例如,尝试使用以下两种方法使用以下文件:

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

cat<<EOF
a
b
c
EOF

4
如果使用引号,则空格将保持不变:eval "$(cat file)"
glenn jackman 2012年

1
是的,那也应该起作用。但是,如果无论如何还是必须更改代码,我更喜欢,source因为它是专门为此而设计的命令。
Florian Diesch

9

如@glennjackman所提到的,您将希望引用命令替换,否则分词和路径名扩展将在逃避内容之前对其进行修改。尽管两者都将执行文件中的命令,但还是有所不同。

  • 当您源脚本,各种特殊shell变量将被修改,主要是BASH_SOURCEBASH_LINENOFUNCNAME阵列。这些对于打印错误消息和调试很有用。

  • 您可以使用return命令(help return)从源脚本中返回。有了eval,您将不会获得那种效果。同样,评估不会触发RETURN陷阱。

  • 在采购脚本时,可以向其传递参数。您无法通过该评估来做到这一点。

  • 使用eval,命令替换会将文件的全部内容读入内存,然后再传递给eval。当您获取它时,bash将从文件中读取文件。


1

这里有一个关于eval和exec的来源的很好的总结:http : //www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html

我认为您使用eval和来源文件会做同样的事情。但我不确定,下标中的变量在任何情况下的行为都相同。如果可能的话,我建议使用source,因为这是更直接的方法,可以使您的代码更具可读性。


3
完全切线:bash具有速记$(cat file)->$(< file)
glenn jackman 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.