在Perl中重写die,在Windows上仍然返回正确的退出代码
在Windows上,我只想在脚本死亡时执行某些操作。 下面的街区没用;我想这是因为Windows不支持信号在Perl中重写die,在Windows上仍然返回正确的退出代码,perl,Perl,在Windows上,我只想在脚本死亡时执行某些操作。 下面的街区没用;我想这是因为Windows不支持信号 $SIG{__DIE__} = sub { qx(taskkill /F /IM telnet.exe); CORE::die @_; } 然后我试了一下: END { qx(taskkill /F /IM telnet.exe); exit $exit_code; } 它执行了taskkill,但退出时退出代码为0。我需要传播exit\u code,因
$SIG{__DIE__} = sub {
qx(taskkill /F /IM telnet.exe);
CORE::die @_;
}
然后我试了一下:
END {
qx(taskkill /F /IM telnet.exe);
exit $exit_code;
}
它执行了
taskkill
,但退出时退出代码为0。我需要传播exit\u code
,因为我们需要在此基础上进行进一步处理。END
块可以设置$?
来控制退出值
END {
qx(taskkill /F /IM telnet.exe);
$? = $exit_code;
}
$SIG{{uuuuu DIE}
不是真正的信号。它在所有平台上都能完美工作。它在抛出异常时被调用。但我确实看到它在Windows上不起作用,我使用Perl 5.18。什么在Windows上不起作用<代码>$SIG{{uuuuu DIE}?同样,它工作得很好。如果您尝试perl-e“$SIG{{uu DIE{uuuu}=sub{warn('Foo:',@});exit(123);};DIE'bar'
,您将看到Foo:
错误消息的前面,如果您使用echo%ERRORLEVEL%
进行后续操作,您将看到123
。感谢ikegami在这方面花时间提供帮助,正如我在上面的原始问题中提到的那样,我尝试了$SIG{{uuuuu DIE}
,并在脚本中添加了一个“DIE”命令来验证,它没有执行taskkill
不,真的,它可以工作。我已经证明了它是有效的。没有什么能阻止您在\uuu DIE\uuu
处理程序中使用backticksperl-e“$SIG{{uuu DIE}=sub{warn(`echo Foo`,@});exit(123);};DIE'bar'