Perl backtick的行为与控制台命令不同

Perl backtick的行为与控制台命令不同,perl,Perl,因此,我正在编写一个Perl脚本,它在某一点上需要处理另一个脚本的输出。我试图通过在backticks中调用脚本来实现这一点: my @output = `scriptName`; 我已经测试了我想调用backticks的脚本,它工作得很好——甚至在我调用脚本的同一个shell中。但当我将其作为脚本的一部分调用时,它不会产生任何输出。变量保留为空 我已尝试使用system()执行该命令,但仍然没有输出。我不知道为什么。但是,在修复PATH变量之前,我传递到脚本中的特定参数已经给我带来了问题。

因此,我正在编写一个Perl脚本,它在某一点上需要处理另一个脚本的输出。我试图通过在backticks中调用脚本来实现这一点:

 my @output = `scriptName`;
我已经测试了我想调用backticks的脚本,它工作得很好——甚至在我调用脚本的同一个shell中。但当我将其作为脚本的一部分调用时,它不会产生任何输出。变量保留为空

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


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

环境不是您的问题,除非您在调用脚本之前在Perl中显式地调整它。我的建议是-仔细检查脚本的权限,并检查相对路径。我注意到您没有
/scriptName
——因此如果它不在您的路径中,perl也无法找到它

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

此外,在我看来,您的下标可能正在打印到
STDERR
,而不是
STDOUT
。Backticks只捕获标准输出,因此需要借助
2>&1

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

NB:重定向不适用于所有shell(我相信当我遇到类似问题时,tcsh不支持重定向)。Bash很好地实现了重定向。

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