【问题标题】:Perl: system return code is 256 instead of 0Perl:系统返回码是 256 而不是 0
【发布时间】:2019-11-27 17:48:39
【问题描述】:

我有一个 oneliner(Windows 7/10 上的 perl 5):

C:\Windows>perl -e "$x=system('echo c:\users');print $x";

这给了我预期的输出:

c:\users
0

但如果我有这个:

C:\Windows>perl -e "$x=system('explorer c:\users');print $x";

这给了我:

256

并打开文件夹。

我很好奇为什么输出不是0,因为命令执行正确。

类似的问题是here,但没有得到回答。这个问题在这里更具体。也许有人可以回答这个具体问题。

更新 1:

(1) 我更正了从 c:\user 到 c:\users 的路径。以前的路径错误,文件资源管理器 C:\Users\giordano\Documents 已打开。通过此更正,正确的文件夹是 openend,但仍返回 256。

(2) 更好的编码:

C:\Windows>perl -e "system('explorer c:\users');print $?";

【问题讨论】:

  • 这个perl -e "system('explorer c:\user'); print $?"; 给出了相同的结果:256。文件夹将被打开。

标签: perl system return-value


【解决方案1】:

来自system function docs

返回值是等待调用返回的程序退出状态。要获得实际的退出值,请右移八位(见下文)。

$? 中设置了相同的值,其中documents this further

这只是传统的 Unix wait() 系统调用返回的 16 位状态字(或者被编造出来的样子)。因此,子进程的退出值实际上是 ($? >> 8),而 $? & 127 给出了进程死于哪个信号(如果有的话),以及 $? & 128 报告是否存在核心转储。

另请注意,如果存在 fork 或 exec 错误(在这种情况下,errno 设置为 $!),则可以将其设置为 -1。

这意味着在执行第二个命令时,它指示退出状态为 1 (256 >> 8)。我不知道这在 Windows 环境中意味着什么。

【讨论】:

  • 好的。但为什么是美元?不是 0 吗?
  • 您的命令返回状态 1,我不知道 Windows 为什么会这样做。
  • 有趣的是,explorer c:\user 后跟echo %errorlevel% --cmd 的版本echo $?-- 输出0
  • @ikegami 这让它更加好奇和神秘。
猜你喜欢
  • 2013-09-30
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多