system()返回错误的退出代码

Joh*_*Doe 2 perl

system用来调用外部应用程序,我需要解释它的退出代码.

我知道system返回命令的退出代码乘以256,但在foo.bat我写入时exit 256结果为零.

为什么会这样?

ike*_*ami 5

Windows使用32位退出代码,因此exit 256完全有效.

>cmd /c exit 256

>echo %ERRORLEVEL%
256
Run Code Online (Sandbox Code Playgroud)

但是,Perl仅保留最低有效8位.

>perl -e"system 'exit 256'; CORE::say $?>>8"
0

>perl -e"system 'exit 266'; CORE::say $?>>8"
10
Run Code Online (Sandbox Code Playgroud)

这是一个Perl缺陷,没有充分的理由.如果使用Win32 :: Process代替system,则可以获得正确的退出代码.

>perl -MWin32::Process=NORMAL_PRIORITY_CLASS,INFINITE -e"Win32::Process::Create(my $proc, $ENV{COMSPEC}, 'cmd /c exit 256', 0, NORMAL_PRIORITY_CLASS, '.') or die $^E; $proc->Wait(INFINITE); $proc->GetExitCode(my $exit_code); CORE::say $exit_code;"
256
Run Code Online (Sandbox Code Playgroud)