0

我试图了解 eval 语句的工作原理。这是我正在查看的一段我不明白的代码:

    eval `$SOME_DIR/util/dbget.pl \
          VARIABLE1 \
          VARIABLE2 \
          VARIABLE3 \
          VARIABLE4 `

无论如何,经过一些研究,我最初的想法是 eval 只是在命令行中输入这些字符串,这意味着它运行 .pl 脚本,然后......我不确定它对这些变量做了什么。此代码上方的注释说“获取一些参数”,但我不确定这是什么意思。

eval 'VARIABLE' 是否初始化变量?这似乎是这种情况,因为在 eval 之后代码继续使用这些变量,就好像它们现在已初始化(是否执行 if 语句检查等)。

我显然对这种脚本很陌生,只是跳进了一个大型存储库。谢谢你的帮助。

4

2 回答 2

3

好的,反引号被替换为它们之间的命令输出。

获取该eval输出并像输入一样执行它。

在这种情况下,我假设 perl 正在打印出一些变量赋值,比如set VARIABLE1=value1or 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 脚本)不会产生任何破坏性的东西(有意或无意地)。

于 2012-05-16T17:19:22.027 回答
0

两者eval和反引号语法都在 csh 手册页中进行了解释。

如果您使用的是 Linux 系统,那么它很可能csh真的是原始C-shelltcsh的增强版本。csh这些特殊功能在 csh 和 tcsh 中是相同的。反引号语法调用所谓的“命令替换”。

引用我系统上的 tcsh 手册页(进行了一些小的调整以避免降价对反引号字符的特殊处理):

命令替换

命令替换由包含在 [反引号] 中的命令显示。这种命令的输出通常在空格、制表符和换行符处分成单独的单词,空单词被丢弃;此文本然后替换原始字符串。在双引号 (") 内,只有换行符强制新词;保留空格和制表符。

在任何情况下,最后一个换行符都不会强制输入一个新单词。请注意,即使命令输出完整的行,命令替换也可能仅产生单词的一部分。

和:

评估参数 ...

(如在 sh(1) 中。)参数被读取为 shell 的输入,并在当前 shell 的上下文中执行生成的命令。这通常用于执行作为命令或变量替换结果生成的命令,因为解析发生在这些替换之前。有关使用 eval 的示例,请参见 tset(1)。

于 2012-05-16T20:00:33.343 回答