2016-08-19 18 views
3

Iは、次のPerlスクリプト(test.pl)を有する:Pythonの実行から終了コード(test.py)キャプチャしようとしているなぜPerlのsystem()の結果がスクリプトの終了コードではないのですか?

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

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

直接実行Pythonの実行に戻り2を、その

> ./test.py 
> echo $? 
2 

しかし、実行中のPerlは別のものを返します:

> perl test.pl 
512 

なぜ、PerlはPythonとは異なる終了コードを取得したのですか?

+0

'512' *を終了コードにすることはできません。終了コードは1バイトであり、値が大きすぎて収まりません。 –

+0

@CharlesDuffy:Perlの 'system()'は、かなり面白い終了コードを返します。実際の値を取得するには、右に8を移動する必要があります。したがって、512は実際には2を意味する有効な戻り値です: -/ –

+0

@DaveCross、yes、既に存在することを指定する答え。私のポイントは、perlがキャプチャしていたのは、明らかに文字通りの終了コードではないということでした。 –

答えて

8

子供は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です。

5

The documentationと表示されます。実際の終了値を取得するには、右に8シフトしてください。

関連する問題