我正在尝试理解eval语句是如何工作的。下面是我看过的一段我不理解的代码:
eval `$SOME_DIR/util/dbget.pl \
VARIABLE1 \
VARIABLE2 \
VARIABLE3 \
VARIABLE4 `无论如何,我最初的想法是,在一些研究之后,eval只是在命令行中直接键入这些字符串,这意味着它运行.pl脚本,然后...我不确定它对这些变量做了什么。这段代码上面的注释是“获取一些参数”,但我不确定这是什么意思。
eval ' variable‘会初始化变量吗?这似乎是因为在eval之后,代码继续使用这些变量,就像它们现在已经初始化一样(执行if语句检查等)。
我对这种脚本显然是新手,而且刚开始接触大型存储库。谢谢你的帮助。
发布于 2012-05-17 01:19:22
好的,反引号被它们之间的命令输出所取代。
eval接受该输出并执行它,就像输入了类型一样。
在本例中,我假设perl打印出一些变量赋值,比如set VARIABLE1=value1或setenv VARIABLE1 value1。在这种情况下,在上面的eval之后,您应该让$VARIABLE1可用于以后的csh代码。
只在没有eval的情况下运行.pl脚本(我假设它是Perl)不会影响csh进程的环境。通过使用eval,您赋予了Perl代码修改该环境的权限。
这意味着Perl必须知道它的输出是针对csh的,顺便说一下。在sh/bash中,变量赋值的语法是不同的。
ETA更多尝试澄清:
如果您这样做:
$SOME_DIR/util/dbget.pl你会在屏幕上看到一堆变量赋值语句。这是没有用的,并且对shell中的实际变量没有任何影响。
如果您这样做:
echo `$SOME_DIR/util/dbget.pl`您将以一种更间接的方式获得相同的结果:不是将perl代码直接打印到屏幕上,而是打印到一个表达式中,该表达式被传递给csh echo命令,然后echo实际打印到屏幕上。这种区别很微妙,但却很重要:反引号夺走了perl的控制权,并将其重新交回shell手中。一旦shell捕获了输出,它就可以将其存储在变量中,将其写入文件,或者对其执行许多Perl代码无需重写即可处理的其他操作。Perl仍在打印。
如果您这样做:
eval `$SOME_DIR/util/dbget.pl`然后shell所做的就是执行Perl的输出,就好像它是在提示符下输入的一样。这是非常强大的。这也是危险的,因为周围的程序最终会执行编写该程序的人从未见过的代码。因此,您必须相信代码的源代码(在本例中是perl脚本)不会产生任何破坏性的东西(无论是有意还是无意)。
发布于 2012-05-17 04:00:33
csh手册页中介绍了eval和backtick语法。
如果您使用的是Linux系统,那么csh很可能就是tcsh,它是原始csh C-shell的增强版本。这些特殊功能在csh和tcsh中是相同的。反引号语法调用所谓的“命令替换”。
在我的系统上引用tcsh手册页(做了一些小调整,以避免markdown对反引号字符的特殊处理):
命令替代
命令替换由用反引号括起来的命令表示。这类命令的输出通常在空格、制表符和换行处被分解为单独的单词,其中空单词将被丢弃;然后该文本将替换原始字符串。在双引号(")内,只有换行符强制使用新词;保留空格和制表符。
在任何情况下,最后一个换行符都不会强制使用新词。请注意,因此,即使命令输出完整的行,命令替换也可能只产生字的一部分。
和:
评估参数...
(如sh(1)所示。)这些参数被读取为shell的输入,并在当前shell的上下文中执行所产生的命令。这通常用于执行作为命令或变量替换的结果生成的命令,因为解析发生在这些替换之前。有关使用eval.的示例,请参见tset(1
https://stackoverflow.com/questions/10623284
复制相似问题