【问题标题】:Why is the result of system() in Perl not the exact exit code of my script? [duplicate]为什么 Perl 中 system() 的结果不是我脚本的确切退出代码? [复制]
【发布时间】:2016-08-19 15:14:02
【问题描述】:

我有以下 perl 脚本 (test.pl):

my $exit_code = system('./test.py');
print $exit_code."\n";

试图从 python 可执行文件 (test.py) 中捕获退出代码:

#!/bin/env python
import sys
sys.exit(2)

直接运行 python 可执行文件返回 2,这是我的预期:

> ./test.py
> echo $?
2

但是,运行 perl 会返回不同的结果:

> perl test.pl
512

为什么 perl 捕获了与 python 不同的退出代码?

【问题讨论】:

  • 512 不能是退出代码 -- 退出代码是单字节的,因此值太大而无法容纳。
  • @CharlesDuffy:Perl 的system() 返回一个相当时髦的退出代码版本。要获得实际值,您需要右移 8。所以 512 是一个有效的返回值,实际上意味着 2 :-/
  • @DaveCross,是的,答案表明已经存在;我的观点是,perl 捕获的显然根本不是文字退出代码。
  • @Charles Duffy,它们在 Windows 中是 16 位的
  • @ikegami,...如果 OP 没有在他们的脚本上使用 shebangs,我可能认为 Windows 是一个合理的平台,但情况是...

标签: perl


【解决方案1】:

孩子甚至可能没有机会打电话给exit。因此,system 的返回值(又名$?)包含的信息不仅仅是exit 参数。

if    ( $? == -1  ) { die "Can't launch child: $!\n"; }
elsif ( $? & 0x7F ) { die "Child killed by signal ".( $? & 0x7F )."\n"; }
elsif ( $? >> 8   ) { die "Child exited with error ".( $? >> 8 )."\n"; }
else                { print "Child executed successfully\n"; }

这是documented

【讨论】:

    【解决方案2】:

    The documentation“要获得实际的退出值,请右移八位”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      • 2018-04-24
      相关资源
      最近更新 更多