好的,反引号被替换为它们之间的命令输出。
获取该eval
输出并像输入一样执行它。
在这种情况下,我假设 perl 正在打印出一些变量赋值,比如set VARIABLE1=value1
or setenv VARIABLE1 value1
。在这种情况下,在上述之后eval
,您应该可以$VARIABLE1
使用以后的 csh 代码。
只运行 .pl 脚本(我假设是 Perl)eval
不会影响 csh 进程的环境。通过使用eval
,您授予 Perl 代码修改该环境的权限。
这意味着 Perl 必须知道它的输出是为 csh 准备的,顺便说一句。在 sh/bash 中,变量赋值的语法是不同的。
ETA更多尝试澄清:
如果你这样做:
$SOME_DIR/util/dbget.pl
您会在屏幕上打印出一堆变量赋值语句。这没有用,并且对 shell 中的实际变量没有任何影响。
如果你这样做:
echo `$SOME_DIR/util/dbget.pl`
您以更迂回的方式得到相同的结果:不是将 perl 代码直接打印到屏幕上,而是打印到传递给 cshecho
命令的表达式中,然后echo
才是实际打印到屏幕上的内容。这种区别很微妙,但很重要:反引号将控制权从 perl 手中夺回,并将其放回 shell 手中。一旦 shell 捕获了输出,它就可以将它存储在一个变量中,将它写入一个文件,或者用它做很多其他的事情,而无需重写 Perl 代码来处理。Perl 仍然只是打印。
如果你这样做:
eval `$SOME_DIR/util/dbget.pl`
然后,shell 所做的就是执行 Perl 的输出,就好像它是在提示符下键入的一样。这是非常强大的。这也很危险,因为周围的程序最终会执行编写该程序的人从未见过的代码。因此,您必须相信该代码的来源(在这种情况下是 perl 脚本)不会产生任何破坏性的东西(有意或无意地)。