我编写了一个脚本,通过调用已安装的程序来逐个执行文件。相同的程序从终端执行,如procheck abc.pdb
,然后它工作正常。但是当我在 Perl 脚本中执行这个程序时
#!/usr/bin/perl -w
@proc = glob '*.pdb';
foreach $proc (@proc)
{
system ('procheck $proc 2.0');
}
出现错误
sh: 1: procheck: not found
答案1
这里有两件事可能存在问题。首先,使用单引号字符串时,变量不会扩展,因此system()
调用会看到文字 string procheck $proc 2.0
。由于它包含 shell 特有的字符($
),Perl 通过 shell 运行命令,因此 shell 有机会扩展它。除非您的环境包含变量proc
,否则它将扩展为空。但这并不重要,因为 shell 似乎甚至无法procheck
在PATH
.它对此有所抱怨。
如果我们将引号更改为双引号,则 Perl 会扩展该变量(这可能是您想要的,因为您在循环中使用该变量)。但随后您可能会收到 Perl 发出的关于无法找到procheck
.
解决方案是提供程序的完整路径,或者确保它位于脚本中PATH
。
尽管如果在交互式 shell 上运行它可以工作,但它procheck
实际上可能是一个别名或函数。如果它只是一个常规的可执行文件,那么它将位于 中PATH
,它应该继承到 Perl 和子 shell。例如,在 Bash 中,您可以用来type -a procheck
查看它实际运行的内容以及是否有其他替代方案,例如隐藏在别名后面的磁盘文件。
哦,另外,如果您在运行命令时不需要 shell,您可以通过使用 的列表形式system
并将命令的参数作为 的单独参数来防止 Perl 意外调用它system
。在这里,那就是system("procheck", $proc, "2.0")
。
答案2
问题是你使用的是单引号。
试试这个吧...
system ("procheck $proc 2.0");