【问题标题】:Checking whether a program exists检查程序是否存在
【发布时间】:2016-06-18 11:28:54
【问题描述】:

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

后一种选择是最佳解决方案吗?有没有更好的方法在 perl 中进行此检查?

【问题讨论】:

  • 你是否要立即调用该命令?
  • @ikegami 不,脚本已经完成了一半
  • 那么只运行它没有任何意义。
  • 你有外部程序的完整路径吗?
  • @ThisSuitIsBlackNot 我正在检查它是否已安装,所以我猜是 /usr/bin/ 目录。

标签: linux bash perl


【解决方案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";

我只是测试了它,因为我只是写了它。

【讨论】:

  • 哦,这是另一个有趣的选择!作为个人风格说明,我想我宁愿使用qx// 而不是反引号,因为我发现这样更容易阅读!
【解决方案2】:

我最好的猜测是,您想检查是否存在要使用 systemqx// 运行的可执行文件

但是如果你想让你的命令行和 shell 一样,那么你可以使用File::Which

【讨论】:

  • 你不能假设安装了哪个
【解决方案3】:

对我来说,更好的检查是在脚本的开头运行程序(比如-V)。

我将使用与您稍后运行作业相同的调用(通过或不通过 shell,通过 execvp)。一旦完成,请确保查看它是否引发错误。这也在您的链接中进行了讨论,但实际上我会取回输出(not 将其发送出去)并检查。这是查看事物是否真的用尽了您的程序以及它是否是您所期望的最可靠的方法。

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

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


注意。我不确定“bash command”是什么意思:内置的 bash shell,还是您在终端上使用 bash 的事实? Perl 的qxsystem 使用sh shell,而不是bash(如果它们调用shell,这取决于您如何使用它们)。虽然sh 主要是一个链接,并且通常是到bash,但它可能不是并且存在差异,并且您不能依赖您的shell 配置。

如果必须,也可以实际运行 shell,qx(/path/bash -c 'cmd args')。注意引号。您可能需要使用它来找到系统上的确切语法。请参阅this page 和链接。

【讨论】:

    【解决方案4】:

    使用 perl,您可以测试文件的存在性、可读性、可执行性等,看看here

    因此只需使用

    executeBashStuff() if -x $filename;
    

    stat它:

    stat($filename);
    executeBashStuff() if -x _;
    

    【讨论】:

    • open 是多余的。只需execute_bash_stuff() if -x $filename。如果你坚持使用snake_case 变量,你会让很多熟悉 Perl 的人高兴。最终我不确定这是否能回答 OP 的要求
    • 无需评论修复
    猜你喜欢
    • 2011-02-06
    • 2011-08-02
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多