检查程序是否存在

时间:2016-03-04 16:20:59

标签: linux bash perl

在我的perl脚本中间,我想执行一个bash命令。脚本需要很长时间,所以在脚本的开头我想看看命令是否存在。 This answer说只是尝试运行它,this other answer建议使用一些bash命令来测试程序是否存在。

后一种选择是最佳解决方案吗?有没有更好的方法来检查perl?

4 个答案:

答案 0 :(得分:2)

我最好的猜测是,您要检查是否存在要使用systemqx//

运行的可执行文件

但如果您希望命令行的行为与shell相同,那么您可以使用File::Which

答案 1 :(得分:2)

对我而言,似乎更好的检查是在脚本开头运行程序(-V说)。

我将使用与稍后运行作业相同的调用(通过shell或不通过execvp)。一旦到达,请确保查看是否出现错误。这也在你的链接中讨论,但我实际上会得到输出(发送它)并检查。这是确定事物是否实际耗尽程序以及它是否符合预期的最可靠方法。

使用-x检查可执行文件(如果您知道路径)也很有用,但它只会告诉您具有给定名称的文件存在且可执行。

系统的which似乎对其可能的(错误)行为持批评态度,它可能是也可能不是shell-builtin(这使得它的确切使用方式复杂化),是一个外部实用程序,并且它的确切行为取决于系统。 Borodin的答案中指出的模块File::Which会更好 - 如果它确实比which更好。 (它可能是什么,我只是不知道。)

注意的。我不确定“ bash命令”是什么意思:内置的bash shell,或者你在终端上使用bash的事实? Perl的qxsystem使用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";

我刚刚测试了它,因为我刚刚写了它。