sh: 1: 找不到程序

sh: 1: 找不到程序

我编写了一个脚本,通过调用已安装的程序来逐个执行文件。相同的程序从终端执行,如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 似乎甚至无法procheckPATH.它对此有所抱怨。

如果我们将引号更改为双引号,则 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");

相关内容