Перезапустите существующий Perl-скрипт, используя $ ^ X в контексте списка, если он содержит пробелы - PullRequest
2 голосов
/ 19 января 2012

Я запускаю программу, которую периодически хотел бы перезапустить. Я предпочитаю передать exec список, чтобы оболочка не включалась следующим образом:

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

Когда я делаю это (в Windows) и $ ^ X содержит пробелы, используя приведенное выше, он обрабатывает $ ^ X как несколько элементов и завершается неудачей.

Следующее работает просто отлично, но запускает подоболочку в дополнение к скрипту:

    # 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 с учетом списка работает.

Ответы [ 3 ]

1 голос
/ 19 января 2012

Файлы 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 тоже).

0 голосов
/ 20 января 2012

Нельзя передавать аргументы программе Windows, только командную строку.(Да, это ужасно.) В сочетании со странностями как в Perl, так и в Window * CreateProcess, мы получаем все виды любопытного поведения.

Я сейчас не на Windows, но я думаю, что вы можетеэто работать с:

exec { $^X } "perl", $0, @ARVG
0 голосов
/ 19 января 2012

Вы пробовали следующее?

exec $^X $0, @ARVG

Примечание: запятая после первого аргумента отсутствует.Если это работает, обратитесь к perldoc -f exec, чтобы узнать, почему существует специальный синтаксис для exec PROGRAM LIST.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...