加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何检查perl -MCPAN -e的返回值/退出状态?

发布时间:2020-12-15 22:38:38 所属栏目:安全 来源:网络整理
导读:我正在为我的公司编写安装程序,以便我们可以轻松设置新机器.其中一部分是通过单独的perl -MCPAN -e’install“Module :: Name”’命令安装的一系列CPAN模块.我创建了一个模块数组(大约200个),它通过bash脚本中的foreach循环安装.但是,我现在想在启动新模块之
我正在为我的公司编写安装程序,以便我们可以轻松设置新机器.其中一部分是通过单独的perl -MCPAN -e’install“Module :: Name”’命令安装的一系列CPAN模块.我创建了一个模块数组(大约200个),它通过bash脚本中的foreach循环安装.但是,我现在想在启动新模块之前检查模块安装的退出状态,这可能吗?这是我到目前为止所尝试的:

for i in "${CPANmodules[@]}"
do
    echo -e "33[1;32mInstalling CPAN module $i 33[0m"
    perl -MCPAN -e "install "$i""
    if [ $? -ne 0 ]
    then
        echo "Error installing module $i"
    fi
done

我也试过以下,没有成功:

perl -MCPAN -e 'install "Madeup::Modulename"'
perl -e 'print $?'

但是,即使模块甚至不存在,它也始终返回0.

任何帮助,将不胜感激.

解决方法

您可以使用 failed命令显示在当前会话中未能制作,测试或安装的所有模块.遗憾的是,失败并不会返回失败次数,而只是将结果打印到STDOUT.

可能有更好的方法来做到这一点,但使用以下hack过滤输出似乎有效:

perl -MCPAN -wE '
    CPAN::Shell->install("Foo::Bar");
    open my $buffer,">",my $failed or die $!;
    my $stdout = select $buffer;
    CPAN::Shell->failed;
    select $stdout;
    close $buffer;
    exit 1 unless $failed =~ /Nothing failed in this session/'

(将STDOUT重定向到从simbabque’s answer到另一个SO问题的变量的代码)

请注意,如果在CPAN上找不到模块,则返回零,因为它甚至永远不会进入make阶段.

您还可以使用uptodate命令,如果指定的模块已安装并且是最新的,则返回1:

perl -MCPAN -wE '
    $name = "Foo::Bar";
    CPAN::Shell->install($name);
    $mod = CPAN::Shell->expandany($name);
    exit(! defined $mod || ! $mod->uptodate)'

当然,如果您要安装较旧版本的模块(并且我不确定开发版本),这将不起作用.

如果您愿意尝试不同的安装程序,cpanm实际上会返回合理的值:0表示成功安装和升级,1表示未找到或未能安装的模块.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读