【问题标题】:How can I quickly check if Linux `unzip` is installed using Perl?如何快速检查是否使用 Perl 安装了 Linux `unzip`?
【发布时间】:2010-01-21 03:43:38
【问题描述】:

如何快速检查 Linux unzip 是否使用 Perl 安装?

【问题讨论】:

    标签: linux perl


    【解决方案1】:

    只需运行它。

    说真的。

    想必为什么你想知道它是否安装的原因,是因为你需要稍后运行它。在这种情况下,知道它是否已安装是不够的——您还需要知道它是否可执行,是否在路径中,运行脚本的用户 id 是否具有运行所需的权限它等等。您只需运行它即可检查所有内容。

    【讨论】:

    • 可能是用户想要检查他的代码的依赖关系并指导用户安装它们。
    【解决方案2】:
    `which unzip`
    

    如果有输出,它指向解压缩的位置。如果没有输出,则什么都不会显示。这依赖于解压缩在您的路径上。

    【讨论】:

    • 我假设哪个是所有 linux 系统的标准?
    • 它出现在我使用过的每一个 Unix 和 Linux 系统上。
    • 另外,如果没有找到,它会返回一个非零的退出代码(在 Ubuntu 8.04 上为 1),如果找到它则返回 0
    • which 既不是 POSIX 的一部分,也不是单一 Unix 规范,也不是 Linux 标准基本规范。我现在使用的至少一个 Linux 系统上没有安装它。我记得我过去使用过的其他几个没有它的 Linux 系统。
    • which which 会告诉你是否安装了which :) 在大多数现代系统上,是的。在 2007 或更早的系统上,它的触手可及。 which 无论如何只会搜索你的路径.. 所以一个可移植的解决方法是你自己做。
    【解决方案3】:

    这将验证unzip 命令是否在您的路径上,以及它是否可由当前用户执行。

    print "unzip installed" if grep { -x "$_/unzip"}split /:/,$ENV{PATH}
    

    【讨论】:

      【解决方案4】:

      取自 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");
      

      【讨论】:

        【解决方案5】:

        我只是使用Archive::Extract 并将其配置为首选二进制而不是 Perl 模块。如果有unzip,它就会使用它。否则,它会退回到纯 Perl。

        【讨论】:

          【解决方案6】:
          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"; }'
          【解决方案7】:

          任何特定的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
          }
          

          另见my multi-which script

          【讨论】:

            【解决方案8】:

            也许你应该退后一步,问问你为什么需要来自 Perl 的unzip 命令。是因为你想解压缩一些东西吗?如果是这样,那么您应该考虑使用许多可用模块之一以编程方式执行此操作,例如Archive::Zip.

            【讨论】:

            • 有时,您想快速解压缩文件。那么,Archive::Zip 是错误的选择。
            【解决方案9】:

            为什么在使用 Perl 时要调用系统命令?使用解压缩模块,例如 Archive::Extract,(或 CPAN 中的其他模块)

            【讨论】:

              【解决方案10】:

              【讨论】:

                【解决方案11】:

                您可以试试这个脚本(已测试)。它使用 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'; 时这没有给出任何结果
                猜你喜欢
                • 2012-03-09
                • 2010-10-22
                • 2020-10-01
                • 2021-01-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-10-06
                相关资源
                最近更新 更多