2016-03-04 78 views
0

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

后者选项是最佳解决方案吗?有没有更好的方法在perl中执行此检查?

+0

你打算立即调用命令吗? – ikegami

+0

@ikegami不,它的一半通过脚本 – flakes

+0

然后只是运行它是没有意义的。 – ikegami

回答

1

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

因此只使用

executeBashStuff() if -x $filename; 

stat它:

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

“开放”是多余的。只要'execute_bash_stuff()if -x $ filename'。如果你一直使用'snake_case'变量,你会让很多熟悉Perl的人感到开心。最终,我不确定这是否回答OP要求的内容 – Borodin

+0

无需对修复进行评论 – Borodin

1

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

运行可执行文件是否存在

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

1

对我来说,似乎最适合运行程序本身(与-V说),每个链接。我将使用与稍后用于运行作业相同的调用(通过shell或不通过execvp)。确保你知道它是否抛出错误。这也在你的链接讨论,但我会实际上得到的输出(而不是发送它)并检查。这可能是最确定的方式,看看这个东西是否真的在运行,以及它是否是你期望的。

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

该系统的which似乎被批评为可能的(错误)行为,它可能是也可能不是一个shell内建的(这正确地使用它会复杂化),是一种外部效用,它的确切行为是依赖于系统的。在Borodin的答案中指出的模块File::Which会更好 - 如果确实比which更好。 (这可能是,我只是不知道。)

从一开始您的处理是否依赖于此?如果没有,您可能希望在最适合您的代码的位置执行此操作。我喜欢在实际使用之前或之后坚持这种检查,如果其他处理按照它的方式进行的话。无论如何,支票是使用它的一部分。


。我不知道什么“bash命令”是指:内置的bash shell,还是在终端上使用bash的事实? Perl的qxsystem使用了sh shell,而不是bash(如果它们调用shell,这取决于你如何使用它们)。有差异,你不能依赖你的shell配置。如果必须的话,你也可以运行一个shell,qx(/path/bash -c 'comm args')。注意报价。您可能需要使用它来查找系统上的确切语法。例如,请参阅this post(bash-in-qx)。