【问题标题】:Csh eval statement?csh eval 语句?
【发布时间】:2012-05-16 17:04:06
【问题描述】:

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

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

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

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

我显然是这种脚本的新手,只是跳入了一个大型存储库。谢谢你的帮助。

【问题讨论】:

  • set -vx 开启shell 调试(我认为这对csh 来说是正确的)。然后您可以在不同的处理步骤中查看变量的值。祝你好运。
  • 反引号位于键盘的左上角,紧挨着 1 键(通常)。祝你好运。
  • 在基于 Debian 的系统上,csh 中有一个严重的错误:eval 总是因分段错误而死。它不影响tcsh。 /bin/csh 可以是 bsd-csh 或 tcsh。 bugs.debian.org/cgi-bin/bugreport.cgi?bug=933057

标签: string eval csh


【解决方案1】:

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

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

在这种情况下,我假设 perl 正在打印出一些变量赋值,例如 set VARIABLE1=value1setenv VARIABLE1 value1。在这种情况下,在上述eval 之后,您应该有$VARIABLE1 可用于以后的csh 代码。

只运行没有eval 的.pl 脚本(我假设是Perl)不会影响csh 进程的环境。通过使用eval,您将授予 Perl 代码修改该环境的权限。

这意味着 Perl 必须知道它的输出是为 csh 准备的,顺便说一句。在 sh/bash 中变量赋值的语法是不同的。

预计到达时间更多尝试澄清:

如果你这样做:

$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 脚本)不会产生任何破坏性(有意或无意)。

【讨论】:

  • 很好地解释了 back-tics 和 eval。祝大家好运。
  • 是的,注意到这一点并编辑了我的评论。将很快删除它;-)
  • 好的,perl 脚本设置变量是有道理的。但是,在评估 VARIABLE1 之后究竟有什么意义呢?这是您必须做的才能使其可用于 csh 代码吗?我认为这就是您的回答所说的,但我真的不明白为什么。
  • perl 代码不能说“嘿,csh!将此变量设置为此值!” csh 本身之外的任何东西都无法做到这一点。 perl 所能做的就是打印出 csh 语句,这些语句如果由 csh 执行,就会得到想要的结果。但这仍然只是 perl 打印出来的文本;在执行之前它不会任何事情。 eval 告诉 csh 执行 perl 打印的代码。
【解决方案2】:

eval 和反引号语法在 csh 手册页中都有解释。

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

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

命令替代

命令替换由 [反引号] 括起来的命令显示。输出 从这样的命令通常在空格处分成单独的单词, 制表符和换行符,空词被丢弃;那么这段文字 替换原始字符串。在双引号 (") 内,仅 换行符强制新词;保留空白和制表符。

在任何情况下,最后一个换行符都不会强制一个新单词。笔记 因此,命令替换可能只产生部分 一个单词,即使命令输出一个完整的行。

还有:

评估 arg ...

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

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多