Csh评估声明?

时间:2012-05-16 17:04:06

标签: string eval csh

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

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

引号是这些奇怪的左指法国式东西(不知道如何制作它们,如果它们在csh中是必要的)。

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

在这种情况下,我假设perl正在打印一些变量赋值,例如set VARIABLE1=value1setenv 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)。