eval $(cat filename) 与源文件名相同吗?

Ben*_*min 11 command-line bash

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

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

gei*_*rha 11

正如@glennjackman 已经提到的,您需要引用命令替换,否则分词和路径名扩展将在内容被评估之前修改内容。虽然两者都将执行文件中的命令,但还是有区别的。

  • 当您获取脚本时,将修改各种特殊的 shell 变量,主要是BASH_SOURCEBASH_LINENOFUNCNAME数组。这些对于打印错误消息和调试很有用。

  • 您可以使用return命令 ( help return)从源脚本返回。使用 eval,你不会得到那种效果。同样,不会为 eval 触发 RETURN 陷阱。

  • 在获取脚本时,您可以将参数传递给它。你不能用那个 eval 做到这一点。

  • 使用 eval,命令替换将在将文件传递给 eval 之前将文件的全部内容读入内存。当您获取它时,bash 将在运行时从文件中读取。


Flo*_*sch 6

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

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

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

cat<<EOF
a
b
c
EOF
Run Code Online (Sandbox Code Playgroud)

  • 如果使用引号,空格将保持不变:`eval "$(cat file)"` (5认同)