Linux 检查程序是否存在

Linux 检查程序是否存在,linux,bash,perl,Linux,Bash,Perl,在perl脚本的中间,我想执行一个bash命令。这个脚本需要很长时间,所以在脚本的开头我想看看这个命令是否存在。表示只需尝试运行它,并建议使用一些bash命令来测试程序是否存在 后一种选择是最好的解决方案吗?有没有更好的方法在perl中执行此检查?使用perl,您可以测试文件的存在性、可读性、可执行性等,请看一看 所以只要使用 executeBashStuff() if -x $filename; 或statit: stat($filename); executeBashStuff() if

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


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

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

所以只要使用

executeBashStuff() if -x $filename;
stat
it:

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

我的最佳猜测是,您希望使用
system
qx/
检查是否存在要运行的可执行文件


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

对我来说,更好的检查方法似乎是在脚本的开头运行程序(比如使用
-V

我将使用与稍后运行作业相同的调用(无论是否通过shell,通过
execvp
)。一旦检查了它,确保查看它是否抛出错误。在你的链接中也讨论了这一点,但事实上我会把输出拿回来(而不是发送出去)并检查一下。这是最可靠的方法,可以看出这个东西是否真的超出了你的程序,以及它是否是你所期望的

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

系统的
似乎因其可能的(mis)行为而受到批评,它可能是也可能不是一个外壳内置(使如何准确使用它变得复杂),它是一个外部实用程序,其确切行为取决于系统。在的答案中指出的模块
File::Which
会更好——如果它确实比
Which
更好的话。(可能是什么,我只是不知道。)



注意。我不知道“bash命令”是什么意思:内置bash shell,还是在终端上使用bash?Perl的
qx
system
使用
sh
shell,而不是
bash
(如果它们调用shell,这取决于您如何使用它们)。存在差异,您不能依赖shell配置。如果必须,您还可以实际运行shell,
qx(/path/bash-c'comm args')
。注意引用。您可能需要使用它来查找系统上的确切语法。请参阅和链接。

如果我们假设不知道命令的位置,该怎么办? 这意味着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";

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

你要立即调用该命令吗?@ikegami不,它已经完成了一半的脚本,然后只是运行它没有任何意义。你有外部程序的完整路径吗?@ThisSuitesBlacknot我正在检查它是否已安装,所以我猜/usr/bin/目录是多余的。只要
执行\u bash\u stuff(),如果-x$filename
。如果你坚持使用
snake\u case
变量,你会让很多熟悉Perl的人感到高兴。最终,我不确定这是否回答了OP的问题,不需要对修复进行评论哦,这是另一个有趣的选择!作为一个个人风格的注释,我想我更愿意使用
qx/
作为背景标记,因为我发现这更容易阅读!