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

Bash 如何检查perl-MCPAN-e的返回值/退出状态?,bash,perl,return-value,cpan,exit-code,Bash,Perl,Return Value,Cpan,Exit Code,我目前正在为我的公司编写一个安装程序,以便我们可以轻松地安装新机器。其中一部分是一系列CPAN模块,通过单个perl-MCPAN-e'install“Module::Name”命令安装。我制作了一个模块数组(大约200个),通过bash脚本中的foreach循环安装。但是,我现在想在开始新的模块安装之前检查模块安装的退出状态,这可能吗?以下是我迄今为止所做的尝试: for i in "${CPANmodules[@]}" do echo -e "\033[1;32mInstalling

我目前正在为我的公司编写一个安装程序,以便我们可以轻松地安装新机器。其中一部分是一系列CPAN模块,通过单个
perl-MCPAN-e'install“Module::Name”
命令安装。我制作了一个模块数组(大约200个),通过bash脚本中的foreach循环安装。但是,我现在想在开始新的模块安装之前检查模块安装的退出状态,这可能吗?以下是我迄今为止所做的尝试:

for i in "${CPANmodules[@]}"
do
    echo -e "\033[1;32mInstalling CPAN module $i \033[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


任何帮助都将不胜感激。

请使用此形式的CPAN安装方法

sudo perl -MCPAN -e 'CPAN::Shell->install("Devel::Cover") or exit 18'
您可以使用该命令显示当前会话中未能
生成
测试
安装
的所有模块。不幸的是,
failed
不会返回失败次数,而只是将结果打印到
STDOUT

也许有更好的方法可以做到这一点,但使用以下方法过滤输出似乎是可行的:

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重定向到从中获取的变量到另一个SO问题的代码)

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

您还可以使用命令,如果指定的模块已安装且为最新版本,则该命令将返回1:

perl -MCPAN -wE '
    $name = "Foo::Bar";
    CPAN::Shell->install($name);
    $mod = CPAN::Shell->expandany($name);
    exit(! defined $mod || ! $mod->uptodate)'
当然,如果您安装的是较旧版本的模块(我不确定开发版本),这将不起作用



如果您愿意尝试其他安装程序,实际上会返回正确的值:0表示成功安装和升级,1表示找不到或安装失败的模块。

只是猜测:您可以安装“Madeup::Modulename”或退出1吗??不过,这是一个很好的建议,它没有改变任何东西。在@TomFenech的建议下,这里的一个快速测试在我的CentOS 5机器上运行(在我运行了CPAN设置之后,因为我以前从未在该机器上使用过它)。它仍然为我返回0。您使用了Tom发布的确切语法吗?编辑:这总是返回18。尝试使用madeup名称、已安装的模块和尚未安装的模块(但已成功安装)。全部返回18。编辑了我以前的评论。谢谢你的回答。谢谢你的回答。如果我想要我想要的功能,我想我将不得不切换到cpanm。@Bifrost个人来说,我更喜欢
cpanm
,因为默认情况下,它比
cpan
详细得多。