在我的perl脚本中间,我想执行一个bash命令。脚本需要很长时间,所以在脚本的开头我想看看命令是否存在。 This answer说只是尝试运行它,this other answer建议使用一些bash命令来测试程序是否存在。
后一种选择是最佳解决方案吗?有没有更好的方法来检查perl?
答案 0 :(得分:2)
我最好的猜测是,您要检查是否存在要使用system
或qx//
但如果您希望命令行的行为与shell相同,那么您可以使用File::Which
答案 1 :(得分:2)
对我而言,似乎更好的检查是在脚本开头运行程序(-V
说)。
我将使用与稍后运行作业相同的调用(通过shell或不通过execvp
)。一旦到达,请确保查看是否出现错误。这也在你的链接中讨论,但我实际上会得到输出(不发送它)并检查。这是确定事物是否实际耗尽程序以及它是否符合预期的最可靠方法。
使用-x
检查可执行文件(如果您知道路径)也很有用,但它只会告诉您具有给定名称的文件存在且可执行。
系统的which
似乎对其可能的(错误)行为持批评态度,它可能是也可能不是shell-builtin(这使得它的确切使用方式复杂化),是一个外部实用程序,并且它的确切行为取决于系统。 Borodin的答案中指出的模块File::Which
会更好 - 如果它确实比which
更好。 (它可能是什么,我只是不知道。)
注意的。我不确定“ bash命令”是什么意思:内置的bash shell,或者你在终端上使用bash的事实? Perl的qx
和system
使用sh
shell,而不是bash
(如果他们调用shell,这取决于你如何使用它们)。存在差异,您不能依赖shell配置。如果必须,您还可以实际运行shell qx(/path/bash -c 'comm args')
。记住报价。您可能需要使用它来查找系统上的确切语法。请参阅this page和链接。
答案 2 :(得分:1)
使用perl,您可以测试文件是否存在,可读性,可执行性等,看看here。
因此只需使用
executeBashStuff() if -x $filename;
或stat
:
stat($filename);
executeBashStuff() if -x _;
答案 3 :(得分:1)
如果我们假设不知道命令的位置怎么办? 这意味着syck的答案无效,而zdim的答案不完整。
在perl中尝试此功能:
sub check_exists_command {
my $check = `sh -c 'command -v $_[0]'`;
return $check;
}
# two examples
check_exists_command 'pgrep' or die "$0 requires pgrep";
check_exists_command 'readlink' or die "$0 requires readlink";
我刚刚测试了它,因为我刚刚写了它。