我正在运行一个我想定期重新启动的程序。我更喜欢传递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
中)。