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阶段. 您还可以使用 perl -MCPAN -wE ' $name = "Foo::Bar"; CPAN::Shell->install($name); $mod = CPAN::Shell->expandany($name); exit(! defined $mod || ! $mod->uptodate)' 当然,如果您要安装较旧版本的模块(并且我不确定开发版本),这将不起作用. 如果您愿意尝试不同的安装程序, (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |