我试图了解eval语句的工作原理。这是我正在看的代码片段,我不明白:
eval '$SOME_DIR/util/dbget.pl \
VARIABLE1 \
VARIABLE2 \
VARIABLE3 \
VARIABLE4 '
引号是这些奇怪的左指法国式东西(不知道如何制作它们,如果它们在csh中是必要的)。
无论如何,经过一些研究我的初步想法是eval只是在命令行中输入那些字符串,这意味着它运行.pl脚本,然后......我不确定它对这些变量做了什么。这段代码上面的评论说“得到一些参数”,但我不确定这意味着什么。
eval'VARIABLE'是否初始化变量?这似乎是这种情况,因为在eval之后代码继续使用这些变量,好像它们现在已经初始化(如果语句检查等)。
我对这种脚本很明显,只是跳进一个大型存储库。谢谢你的帮助。
答案 0 :(得分:2)
好的,反引号被替换为它们之间命令的输出。
eval
获取该输出并像键入一样执行它。
在这种情况下,我假设perl正在打印一些变量赋值,例如set VARIABLE1=value1
或setenv VARIABLE1 value1
。在这种情况下,在上述eval
之后,您应该$VARIABLE1
可以使用以后的csh代码。
在没有eval
的情况下运行.pl脚本(我假设是Perl)不会影响csh进程的环境。通过使用eval
,您可以授予Perl代码修改该环境的权限。
这意味着Perl必须知道它的输出是用于csh,btw。在sh / bash中,变量赋值的语法是不同的。
ETA 更多尝试澄清:
如果你这样做:
$SOME_DIR/util/dbget.pl
您会在屏幕上打印出一堆变量赋值语句。这没用,并且对shell中的实际变量没有任何影响。
如果你这样做:
echo `$SOME_DIR/util/dbget.pl`
你以更迂回的方式得到相同的结果:它不是直接打印到你的屏幕上的perl代码,而是打印成一个传递给csh echo
命令的表达式,然后是echo
是实际打印到屏幕的内容。这种区别是微妙的,但很重要:反引号将控制权从perl中移开并将其放回到外壳的手中。一旦shell捕获了输出,它就可以将它存储在一个变量中,将其写入一个文件,或者用它做很多其他的事情,Perl代码不必重写以进行处理。 Perl仍在打印。
如果你这样做:
eval `$SOME_DIR/util/dbget.pl`
然后shell执行的操作是执行Perl的输出,就像在提示符下键入它一样。这非常强大。它也很危险,因为周围的程序会执行编写该程序的人从未见过的代码。因此,您必须相信该代码的来源(在本例中为perl脚本)不会产生任何损害(intentinonally或其他)。
答案 1 :(得分:0)
csh手册页中解释了eval
和反引号语法。
如果您使用的是Linux系统,则csh
可能是tcsh
,这是原始csh
C-shell的增强版本。这些特殊功能在csh和tcsh中都是相同的。反引号语法调用所谓的“命令替换”。
在我的系统上引用tcsh手册页(进行一些小调整以避免markdown对反引号字符的特殊处理):
命令替换
命令替换由[backticks]中的命令显示。输出 从这样的命令通常被分成单独的单词, 制表符和换行符,丢弃空字;那么这个文本 替换原始字符串。仅在双引号(“)内 新行强迫新词;保留空白和标签。
在任何情况下,单个最终换行都不会强制换一个新单词。注意 因此,命令替换可能只产生一部分 一句话,即使命令输出一个完整的行。
和
eval arg ...
(如sh(1)中所述。)参数被读作shell的输入和 生成的命令在当前shell的上下文中执行。 这通常用于执行作为结果生成的命令 命令或变量替换,因为解析发生在这些之前 换人。有关使用eval的示例,请参阅tset(1)。