【发布时间】:2010-01-21 03:43:38
【问题描述】:
如何快速检查 Linux unzip 是否使用 Perl 安装?
【问题讨论】:
如何快速检查 Linux unzip 是否使用 Perl 安装?
【问题讨论】:
只需运行它。
说真的。
想必为什么你想知道它是否安装的原因,是因为你需要稍后运行它。在这种情况下,知道它是否已安装是不够的——您还需要知道它是否可执行,是否在路径中,运行脚本的用户 id 是否具有运行所需的权限它等等。您只需运行它即可检查所有内容。
【讨论】:
`which unzip`
如果有输出,它指向解压缩的位置。如果没有输出,则什么都不会显示。这依赖于解压缩在您的路径上。
【讨论】:
which 既不是 POSIX 的一部分,也不是单一 Unix 规范,也不是 Linux 标准基本规范。我现在使用的至少一个 Linux 系统上没有安装它。我记得我过去使用过的其他几个没有它的 Linux 系统。
which which 会告诉你是否安装了which :) 在大多数现代系统上,是的。在 2007 或更早的系统上,它的触手可及。 which 无论如何只会搜索你的路径.. 所以一个可移植的解决方法是你自己做。
这将验证unzip 命令是否在您的路径上,以及它是否可由当前用户执行。
print "unzip installed" if grep { -x "$_/unzip"}split /:/,$ENV{PATH}
【讨论】:
取自 Module::Install::Can:
sub can_run {
my ($self, $cmd) = @_;
my $_cmd = $cmd;
return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd));
for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') {
next if $dir eq '';
my $abs = File::Spec->catfile($dir, $_[1]);
return $abs if (-x $abs or $abs = MM->maybe_command($abs));
}
return;
}
然后:
my $is_it_there = can_run("unzip");
【讨论】:
我只是使用Archive::Extract 并将其配置为首选二进制而不是 Perl 模块。如果有unzip,它就会使用它。否则,它会退回到纯 Perl。
【讨论】:
perl -e 'if (-e "/usr/bin/unzip") { print "present\n"; } else { print "not present\n"; }'
【讨论】:
/usr/local/bin。对吗?
perl -e 'if (-e "/usr/bin/unzip"|"/usr/local/bin/unzip") { print "present\n"; } else { print "not present\n"; }'
任何特定的unzip?我使用的 Linux 系统有 Info-Zip 的 unzip,如果这是你想要检查的,你可以这样做
if ( (`unzip`)[0] =~ /^UnZip/ ) {
# ...
}
如果你想让这更安全一点,你会这样做:
#!/usr/bin/perl -T
use strict; use warnings;
$ENV{PATH} = '/bin:/usr/bin:/usr/local/bin';
use File::Spec::Functions qw( catfile path );
my @unzip_paths;
for my $dir ( path ) {
my $fn = catfile $dir, 'unzip';
push @unzip_paths, $fn if -e $fn;
}
if ( @unzip_paths > 1 ) {
# further narrow down by version etc
}
【讨论】:
也许你应该退后一步,问问你为什么需要来自 Perl 的unzip 命令。是因为你想解压缩一些东西吗?如果是这样,那么您应该考虑使用许多可用模块之一以编程方式执行此操作,例如Archive::Zip.
【讨论】:
为什么在使用 Perl 时要调用系统命令?使用解压缩模块,例如 Archive::Extract,(或 CPAN 中的其他模块)
【讨论】:
【讨论】:
您可以试试这个脚本(已测试)。它使用 which 命令。
#!/usr/bin/perl -w
use strict;
my $bin = "unzip";
my $search = `which $bin 2>&1`;
chomp($search);
if ($search =~ /^which: no/)
{
print "Could not locate '" . $bin . "'\n";
exit(1);
} else {
print "Found " . $bin . " in " . $search . "\n";
exit(0);
}
干杯,
布拉德
【讨论】:
$bin='unusual_name_eg_xyz'; 时这没有给出任何结果