我正在运行一个我想定期重新启动的程序。我更喜欢传递exec列表,以便不涉及以下 shell 程序:

    // Do stuff
    .
    .
    exec $^X, $0, @ARGV;

当我这样做时(在Windows上)并且$ ^ X包含使用上述内容的空格,它将$ ^ X视为多个项目并失败。

以下工作正常,但除了脚本外,还启动了一个子shell:
    # Do stuff
    .
    .
    exec "\"$^X\" $0 @ARGV" ;

这并不是什么大问题,但是我想学习如何在列表上下文中执行。

我尝试过的事情:
    exec "\"$^X\"", $0, @ARGV;
    exec "\\\"$^X\\\"", $0, @ARGV;
    exec "'$^X'", $0, @ARGV;  # Even though Windows doesn't like '

还:
    push @restart, $^X, $0, @ARGV;
    print $restart[0];
    exec @restart;

print语句正确地将可执行文件及其中的空格显示为数组的第一项。

我已将perl可执行文件复制到其路径中不包含空格的位置,并从那里给出了列表工作的exec。

最佳答案

Windows文件具有常规名称和“短”名称,以向后兼容DOS的黄金时代。对于$^X = 'C:\Program Files\perl\perl.exe的特定情况,类似C:/Progra~1/perl/perl.exe的东西可能会起作用。

有关更一般的解决方案,请参见 Win32 GetShortPathName函数。那你可以打电话

exec Win32::GetShortPathName($^X), $0, @args;

(在某些情况下,您可能还需要将$0和参数包装在GetShortPathName中)。

10-06 07:02
查看更多