如何测试 IPC::Run3 的退出状态

2023-11-29

我正在尝试测试 Perl 模块 IPC::Run3 但难以检查命令是否失败或成功。
我知道如果 IPC::Run3 的参数有问题,它会发出退出代码,但是如果参数没问题但命令不存在怎么办?我如何测试以下示例?

有一个子程序来调用 Run3

sub runRun3 {

    my $cmd = shift;
    my ($stdout, $stderr);

    run3($cmd, \undef, \$stdout, \$stderr);

#   if( $? == -1 ) {
    if (! $stdout and ! $stderr) {
        die "Something is wrong";
    } else {
        print "OK \n";
    }

}

当命令$cmds[0]下面被执行(ls*nix 系统的命令)它打印OK正如预期,但有命令$cmds[1]它只是说No such file or directory at ./testrun3.pl line 18。 通过对退出代码的测试,我希望它打印出来Something is wrong反而。

#!/usr/bin/perl

use warnings;
use strict;

use IPC::Run3;

my @cmds = qw(ls silly);

runRun3($cmds[0]);
runRun3($cmds[1]);

或者在这种情况下 IPC::Run3 的最佳替代方案是什么?这只是过程的过度简化,但最终我想捕获 STDERR 和 STDOUT 以应对更复杂的情况。

Thanks.


有几点需要经过。

首先,对于直接问题,IPC::运行3文档告诉我们

run3如果包装则抛出异常system回电-1或者出了什么问题run3文件句柄的处理。否则返回 true。它离开$?完好无损,用于检查退出和等待状态。

您询问的错误属于此类错误,您需要eval捕获该异常的调用

use warnings 'all';
use strict;
use feature 'say';

my ($stdout, $stderr);

my @cmd = ("ls", "-l");

eval { run3 \@cmd, \undef, \$stdout, \$stderr };
if    ( $@        ) { print "Error: $@";                     }
elsif ( $? & 0x7F ) { say "Killed by signal ".( $? & 0x7F ); }
elsif ( $? >> 8   ) { say "Exited with error ".( $? >> 8 );  }
else                { say "Completed successfully";          }

您现在可以在里面打印自己的消息if ($@) { }块,当底层发生错误时system执行失败。例如当调用一个不存在的程序时。

Here $@涉及到eval while $? to system. So if run3没有问题并且$@是 false 接下来我们检查状态system本身,因此$?。来自文档

请注意,真实的返回值来自run3并不意味着该命令 有成功的退出代码。因此你应该经常检查$?.

对于变量$@ and $? see perlvar 中的通用变量, and system and eval pages.

最小版本是删除eval (and $@检查)并期望程序die if run3有问题,什么应该是罕见的,并检查(并打印)的值$?.

注释run3界面。和\@cmd它期望@cmd包含分解为单词的命令,第一个元素是程序和其余参数。在字符串中写入命令之间存在差异,支持$cmd接口,并在一个数组中。看system进行解释。

哪种选择最适合您取决于您​​的具体需求。这里有一些选项。也许先尝试一下IPC::系统::简单(但不是STDERR放在盘子里)。用于干净地捕获各种输出捕获::微小是很棒的。另一端有IPC::Run为了获得更多的力量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测试 IPC::Run3 的退出状态 的相关文章

随机推荐

  • 使用 SolrNet 与 Solr 服务器的间歇性连接超时

    我有一个托管搜索的生产网络服务器 还有另一台托管 Solr 搜索服务器的机器 在同一房间的子网上 因此没有网络问题 gt 90 的时间一切都很好 但我始终收到少量The operation has timed out errors 我已将
  • 在 Google Places API 中使用半径参数的正确方法是什么?

    我正在使用谷歌地方信息API要检索当前位置周围的所有 POI 感兴趣的地方 它工作正常 但我注意到无论半径的值是多少 我总是得到相同数量的结果 20 因此 如果我给出的半径太大 我不一定会得到最近的POIs 如果我将半径减小到足够小 我将再
  • 如何使用 PHP 获取上一个 url

    假设我的网站的网址在互联网上的某个页面上以超链接的形式给出 该页面可以是互联网上的任何内容 博客 orkut yahoo 甚至 stackoverflow 等 有人点击它 并访问了我的网站 那么我们能否使用 php 知道访问者之前访问我的页
  • 409 冲突错误仅在 wifi 上仅在注册期间

    我正在尝试注册用户 但注册过程在移动数据上运行良好 但在 wifi 网络上返回 409 错误 我对这个问题一无所知 邮递员也在返回409冲突 我在 Android 应用程序中收到此响应 E Volley 88456 BasicNetwork
  • 创建用于分发的 Android Jar 库

    我知道 Android 库项目 它允许您创建一个可以根据需要拉入 Android 应用程序的共享源项目 然而 这需要该来源可用 我正在寻找一种构建和分发闭源库的方法 该库可以在其他 Android 项目 如传统 JAR 中使用 这需要使用
  • Gnuplot 平滑置信带

    根据这个问题给出的答案Gnuplot 平滑置信区间线而不是误差线我能够得到与给出的数据相同的结果 y 的误差是对称的 因此它是 y 加 减 errorY x y errorY 1 3 0 6 2 5 0 4 3 4 0 2 4 3 5 0
  • 组合 2 个函数以在 jQuery 或 Javascript 中写入属性数组

    这是原始问题的扩展 jQuery 从日期中提取年份并将类添加到父级 但我需要扩展它 以便组合两个现有函数 然后扩展以在数组而不是类中添加属性 作为类增加价值的原始片段 从 div 获取日期并添加为类 jQuery publication d
  • 如何在 Windows 中获取/设置当前位置?

    我需要能够在 Win 7 中获取 设置当前位置 控制面板 gt 区域和语言 gt 位置 RegionInfo CurrentRegion不起作用 我可以以错误的方式使用它吗 与CultureInfo 有任何想法吗 好的 你需要更改 Wind
  • 在控制台中正确打印 \r

    当我编写更新打印行的脚本时 例如如下所示 for i in range 101 print str i r end 并使用终端 Ubuntu 运行此脚本 我得到正确的输出 更新了该行 100 然而 在 Eclipse 中使用 Pydev E
  • 简单的 HttpURLConnection POST 文件 multipart/form-data 从 android 到 google blobstore

    我对 html 的工作原理知之甚少 我想做的与以下完全相同但在安卓上
  • 传递给 Illuminate\Database\Grammar::parameterize() 的参数 1 必须是数组类型,给定字符串

    清楚地表明 file ids 是数组类型 但仍然收到此错误 并且我使用不同的函数来了解变量的数据类型 例如 gettype 它也返回数组 请帮助我摆脱这个头痛 提前致谢 public function getFilesForLink Req
  • 如何查找 SQL Server 2005 的服务器名称

    我已经在我的系统上安装了 SQL Server 2005 安装后 当我尝试使用它时 它要求输入服务器名称 我努力了 SQLEXPRESS local local localhost localhost localhost computern
  • 如何在Excel中编辑通过宏代码显示的单元格中的信息?

    我有一个宏 这样当您突出显示sheet1上的一行时 该宏就会获取该行中的所有信息 并将其单独显示在sheet2上 如果突出显示sheet1上的不同行 sheet2上的信息将更改以显示该行的信息 我的问题是 如果我更改sheet2上显示的信息
  • Android gradle 3.0.0 - ZLIB 输入流意外结束

    将 android studio 更新到 3 0 并切换到gradle plugin 3 0 0我收到此错误 Gradle project refresh failed Error Unexpected end of ZLIB input
  • 张量流中的加权成本函数

    我试图将权重引入以下成本函数 cost tf reduce mean tf nn sparse softmax cross entropy with logits logits logits labels y 但不必自己做 softmax
  • fork()在for循环中执行

    int main int argc char argv int i 0 while i lt 2 fork system ps o pid ppid comm stat i return EXIT SUCCESS 谁能告诉我 ps 命令执行
  • Visual Studio 2012 上的 mySQL 数据源

    我一直在阅读有关 mySQL 数据源以及将 mySQL 与实体框架结合使用的能力 但如果不使用数据源对话框 我无法真正使用 mySQL 生成 EF 如何将 mySQL 数据库添加到此类对话框 这是我到目前为止所做的 已安装mySQL 连接器
  • 用于传递块的 Ruby 语法 [重复]

    这个问题在这里已经有答案了 为什么带大括号的语法按预期工作 class SomeClass include Parser Http new agent PASSED This block was passed to Http new end
  • 如何使用mockito verify()验证一个方法被调用两次

    我想通过mockito verify验证一个方法是否至少被调用一次 我使用了验证 它抱怨如下 org mockito exceptions verification TooManyActualInvocations Wanted 1 tim
  • 如何测试 IPC::Run3 的退出状态

    我正在尝试测试 Perl 模块 IPC Run3 但难以检查命令是否失败或成功 我知道如果 IPC Run3 的参数有问题 它会发出退出代码 但是如果参数没问题但命令不存在怎么办 我如何测试以下示例 有一个子程序来调用 Run3 sub r