【问题标题】:Perl backtick behaves differently than console commandsPerl 反引号的行为与控制台命令不同
【发布时间】:2014-04-11 13:52:23
【问题描述】:

所以,我正在编写一个 Perl 脚本,它有时需要处理另一个脚本的输出。我试图通过在反引号中调用脚本来做到这一点:

 my @output = `scriptName`;

我已经测试了我想在反引号中调用的脚本,它工作得很好——甚至在我调用我的脚本的同一个 shell 中。但是当我将它作为脚本的一部分调用时,它不会产生任何输出。变量为空。

我尝试使用 system() 执行命令,但仍然没有输出。我不知道为什么。但是,在我修复 PATH 变量之前,我传递给脚本的特定参数给我带来了问题。通过 Perl 脚本调用脚本会以某种方式导致不同的环境变量吗?

编辑:好的,这是一个潜在的问题。我尝试使用反引号和 system() 打印出我的 PATH 变量,但它们都是空白的。我的 Perl 脚本是否由于某种原因无法使用我的 PATH?

【问题讨论】:

  • 您使用的是哪个操作系统?
  • 子进程的环境与父进程的环境相同。看看它是否适合您使用标准命令行实用程序,例如ls。还要检查您尝试运行的脚本是否没有将其输出发送到STDERR,因为您从反引号中得到的只是发送到STDOUT 的所有内容。你也可以试试my @output = `perl -e "print 'working'"`
  • 我在 linux 环境中,并确认反引号和 system() 都可以与“ls”一起使用。我还没有尝试过 STDERR,但我会​​的。
  • PATH 和所有环境变量一样,继承自父进程。
  • 请记住,在将结果字符串传递给 shell 之前,反引号将插入 $PATH,就好像它是一个 perl 变量一样。 (你是use warnings 吗?)通过反引号打印PATH 的正确perl 语法是`echo \$PATH`(带反斜杠)或qx'echo $PATH'(带单引号)。

标签: perl


【解决方案1】:

此类问题的最常见原因是相对路径的差异。出于这个原因,我倾向于使用绝对路径。

此外,在我看来,您的下标可能打印到STDERR 而不是STDOUT。反引号仅捕获 STDOUT,因此您需要在 2>&1 的帮助下进行重定向

my @output = `scriptName 2>&1`;

注意: 重定向不适用于所有 shell(我相信当我遇到类似问题时,是 tcsh 不支持它)。 Bash 接受重定向就好了。

【讨论】:

    【解决方案2】:

    环境不是您的问题,除非您在调用脚本之前在 perl 中明确调整它。我的建议是 - 仔细检查脚本的权限,并检查相对路径。我注意到你没有./scriptName - 所以如果它不在你的路径中,perl 也将无法找到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 2021-09-09
      • 2015-05-29
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      相关资源
      最近更新 更多