Page 1 of 2

Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 14:51
by Smitis
При передачи строки командному процессору функция Execute (в execute.cpp) заключает строку в кавычки, если встретит в ней пробел и/или спецсимволы. Получается вызов вида c:\windows\system32\cmd.exe /c "строка". На самом деле cmd не требует такого заковычивания, но такие строки понимает - обрамляющие кавычки просто удаляются (это даже задокументировано). Но всплывает проблема с TCC (TakeCommand), который вроде как тоже должен кавычки убирать, но когда получаются кавычки в кавычках, результаты разбора строки на параметры у CMD и TCC начинают расходиться. А если эти обрамляющие кавычки не ставить, всё одинаково.
Собственно предложение, сделать это обрамление кавычками опциальным (это если не убрать совсем). Например, параметр System.Executor.QuoteCmdLine, по умолчанию true (т.е., как сейчас), кому надо, выключат через far:config

diff могу подготовить

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 15:00
by John Doe
Smitis wrote:На самом деле cmd не требует такого заковычивания, но такие строки понимает - обрамляющие кавычки просто удаляются (это даже задокументировано).
Где можно почитать о том, что cmd не требует закавычивания?
То что обрамляющие кавычки распознаются и удаляются это понятно, но где написано что они не требуются?

Это?

Code: Select all

Если указаны ключи /C или /K, то остальная часть командной строки после
такого ключа обрабатывается как командная строка[...]

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 15:02
by 2useven10
чем не устраивает System.QuotedName ?

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 15:04
by John Doe
System.QuotedName - это про вставку, а не про запуск

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 15:05
by t-rex
лучше им в суппорт напиши, а для cmd эти кавычки нужны, уже много раз пытались тот код менять, только текущий вариант нормально работает.

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 16:10
by Smitis
t-rex wrote:лучше им в суппорт напиши
Как я понял, обеспечение 100% совместимости с cmd у них не самая приоритетная задача.
а для cmd эти кавычки нужны, уже много раз пытались тот код менять, только текущий вариант нормально работает.
Так я предлагаю - опционно. По умолчанию будет включено, старое поведение не сломается.
John Doe wrote:Это?
Да

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 19:15
by 2useven10
Так я предлагаю - опционно. По умолчанию будет включено, старое поведение не сломается
можно 3-state: on(default), off, other(off если comspec==tcc)

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 19:36
by DrKnS
Smitis wrote:На самом деле cmd не требует такого заковычивания
Конвейеры тестировали?
Я не пробовал, но почему-то подозреваю, что по cmd /c "foo | bar" без кавычек может получиться не то, что ожидалось.

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 19:51
by HaRT
2useven10 wrote:можно 3-state: on(default), off, other(off если comspec==tcc)
Завязываться на имена нестандартных шеллов как-то не комильфо. Да и легко запутаться с их распознаванием: есть ли расширение, есть ли путь и т.п. Сколько пользователей по нескольку раз в день меняют COMSPEC?

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 19:56
by 2useven10
меняют наверное немногие, но те у кого установлены обе оболочки запросто могут запустить фар в любой из них.
add: если DrKnS прав, чистый off вообще вреден.

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 19:59
by Smitis
DrKnS wrote:Конвейеры тестировали?
Вроде нормально было. Завтра пересоберу ФАР, ещё потестирую
2useven10 wrote:меняют наверное немногие, но те у кого установлены обе оболочки запросто могут запустить фар в любой из них.
Так и есть :)

К сожалению, выбор командных процессоров под Виндой очень невелик

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 20:16
by HaRT
2useven10 wrote:меняют наверное немногие, но те у кого установлены обе оболочки запросто могут запустить фар в любой из них.
Ну тогда надо для третьего состояния крыжика ещё задавать список значений COMSPEC, для которых off.

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 20:22
by 2useven10
достаточно ...NotQuotedShell -- список или regex, по-умолчанию пусто.

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 20:38
by HaRT
2useven10 wrote:достаточно ...NotQuotedShell -- список или regex, по-умолчанию пусто.
Как-то не вполне стройно, ведь пустой регэксп находится в любой строке. Может лучше так?: назвать QuotedShell, трактовать как регэксп, по умолчанию пусто (то есть везде закавычивать). Кому надо список, задаст через ‘|’; кому надо никогда не закавычивать, напишет какой-нибудь недопустимый символ, например “>”.

Re: Не заключать командную строку в кавычки

Posted: Thu 30 May, 2013 20:57
by 2useven10
может быть формально оно и правильно, но совсем не интуитивно.
для моего наивного сознания - пусто = нет. если умолчанием сделать /.*/ - тогда нормально.