Answers:
eval $(cat ...)
并非在所有情况下都有效。例如,$(cat ...)
在将内容处理之前,将换行符转换为单个空格eval
。这通常会破坏多行语句,例如循环和此处的文档。
例如,尝试使用以下两种方法使用以下文件:
for i in 1 2 3; do
echo $i
done
cat<<EOF
a
b
c
EOF
source
因为它是专门为此而设计的命令。
如@glennjackman所提到的,您将希望引用命令替换,否则分词和路径名扩展将在逃避内容之前对其进行修改。尽管两者都将执行文件中的命令,但还是有所不同。
当您源脚本,各种特殊shell变量将被修改,主要是BASH_SOURCE
,BASH_LINENO
和FUNCNAME
阵列。这些对于打印错误消息和调试很有用。
您可以使用return
命令(help return
)从源脚本中返回。有了eval,您将不会获得那种效果。同样,评估不会触发RETURN陷阱。
在采购脚本时,可以向其传递参数。您无法通过该评估来做到这一点。
使用eval,命令替换会将文件的全部内容读入内存,然后再传递给eval。当您获取它时,bash将从文件中读取文件。
这里有一个关于eval和exec的来源的很好的总结:http : //www.unix.com/shell-programming-scripting/54347-bash-shell-exec-eval-source-looking-help-understand.html
我认为您使用eval和来源文件会做同样的事情。但我不确定,下标中的变量在任何情况下的行为都相同。如果可能的话,我建议使用source,因为这是更直接的方法,可以使您的代码更具可读性。
$(cat file)
->$(< file)
eval "$(cat file)"