在我的perl脚本的中间,我想执行一个bash命令。该脚本需要很长时间,所以在脚本的开头我想看看命令是否存在。 This answer说只是试着运行它,this other answer建议一些bash命令来测试程序是否存在。检查程序是否存在
后者选项是最佳解决方案吗?有没有更好的方法在perl中执行此检查?
在我的perl脚本的中间,我想执行一个bash命令。该脚本需要很长时间,所以在脚本的开头我想看看命令是否存在。 This answer说只是试着运行它,this other answer建议一些bash命令来测试程序是否存在。检查程序是否存在
后者选项是最佳解决方案吗?有没有更好的方法在perl中执行此检查?
我最好的猜测是,你要检查您要使用system
或qx//
但是,如果您希望命令行的行为与shell相同,那么您可以使用File::Which
对我来说,似乎最适合运行程序本身(与-V
说),每个链接。我将使用与稍后用于运行作业相同的调用(通过shell或不通过execvp
)。确保你知道它是否抛出错误。这也在你的链接讨论,但我会实际上得到的输出(而不是发送它)并检查。这可能是最确定的方式,看看这个东西是否真的在运行,以及它是否是你期望的。
使用-x
(如果您知道路径)检查可执行文件也很有用,但它只会告诉您具有给定名称的文件存在并且它是可执行文件。
该系统的which
似乎被批评为可能的(错误)行为,它可能是也可能不是一个shell内建的(这正确地使用它会复杂化),是一种外部效用,它的确切行为是依赖于系统的。在Borodin的答案中指出的模块File::Which
会更好 - 如果确实比which
更好。 (这可能是,我只是不知道。)
从一开始您的处理是否依赖于此?如果没有,您可能希望在最适合您的代码的位置执行此操作。我喜欢在实际使用之前或之后坚持这种检查,如果其他处理按照它的方式进行的话。无论如何,支票是使用它的一部分。
注。我不知道什么“bash命令”是指:内置的bash shell,还是在终端上使用bash的事实? Perl的qx
和system
使用了sh
shell,而不是bash
(如果它们调用shell,这取决于你如何使用它们)。有差异,你不能依赖你的shell配置。如果必须的话,你也可以运行一个shell,qx(/path/bash -c 'comm args')
。注意报价。您可能需要使用它来查找系统上的确切语法。例如,请参阅this post(bash-in-qx)。
你打算立即调用命令吗? – ikegami
@ikegami不,它的一半通过脚本 – flakes
然后只是运行它是没有意义的。 – ikegami