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

Вам не хватает чего-то в Far? Вы считаете, что вашу идею стоит услышать? Пишите сюда.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

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

diff могу подготовить
Разум когда-нибудь победит.
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

Smitis wrote:На самом деле cmd не требует такого заковычивания, но такие строки понимает - обрамляющие кавычки просто удаляются (это даже задокументировано).
Где можно почитать о том, что cmd не требует закавычивания?
То что обрамляющие кавычки распознаются и удаляются это понятно, но где написано что они не требуются?

Это?

Code: Select all

Если указаны ключи /C или /K, то остальная часть командной строки после
такого ключа обрабатывается как командная строка[...]
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

чем не устраивает System.QuotedName ?
User avatar
John Doe
Бюрократ
Posts: 13801
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 72 times
Been thanked: 425 times
Contact:

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

Post by John Doe »

System.QuotedName - это про вставку, а не про запуск
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

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

Post by t-rex »

лучше им в суппорт напиши, а для cmd эти кавычки нужны, уже много раз пытались тот код менять, только текущий вариант нормально работает.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

t-rex wrote:лучше им в суппорт напиши
Как я понял, обеспечение 100% совместимости с cmd у них не самая приоритетная задача.
а для cmd эти кавычки нужны, уже много раз пытались тот код менять, только текущий вариант нормально работает.
Так я предлагаю - опционно. По умолчанию будет включено, старое поведение не сломается.
John Doe wrote:Это?
Да
Разум когда-нибудь победит.
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

Так я предлагаю - опционно. По умолчанию будет включено, старое поведение не сломается
можно 3-state: on(default), off, other(off если comspec==tcc)
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

Smitis wrote:На самом деле cmd не требует такого заковычивания
Конвейеры тестировали?
Я не пробовал, но почему-то подозреваю, что по cmd /c "foo | bar" без кавычек может получиться не то, что ожидалось.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

2useven10 wrote:можно 3-state: on(default), off, other(off если comspec==tcc)
Завязываться на имена нестандартных шеллов как-то не комильфо. Да и легко запутаться с их распознаванием: есть ли расширение, есть ли путь и т.п. Сколько пользователей по нескольку раз в день меняют COMSPEC?
Фар есть инструмент, а не нянька. © 2009 DrKnS
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

меняют наверное немногие, но те у кого установлены обе оболочки запросто могут запустить фар в любой из них.
add: если DrKnS прав, чистый off вообще вреден.
User avatar
Smitis
Posts: 1709
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 23 times
Been thanked: 55 times

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

Post by Smitis »

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

К сожалению, выбор командных процессоров под Виндой очень невелик
Разум когда-нибудь победит.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

2useven10 wrote:меняют наверное немногие, но те у кого установлены обе оболочки запросто могут запустить фар в любой из них.
Ну тогда надо для третьего состояния крыжика ещё задавать список значений COMSPEC, для которых off.
Фар есть инструмент, а не нянька. © 2009 DrKnS
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

достаточно ...NotQuotedShell -- список или regex, по-умолчанию пусто.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 times

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

Post by HaRT »

2useven10 wrote:достаточно ...NotQuotedShell -- список или regex, по-умолчанию пусто.
Как-то не вполне стройно, ведь пустой регэксп находится в любой строке. Может лучше так?: назвать QuotedShell, трактовать как регэксп, по умолчанию пусто (то есть везде закавычивать). Кому надо список, задаст через ‘|’; кому надо никогда не закавычивать, напишет какой-нибудь недопустимый символ, например “>”.
Фар есть инструмент, а не нянька. © 2009 DrKnS
2useven10
Posts: 5192
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 309 times

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

Post by 2useven10 »

может быть формально оно и правильно, но совсем не интуитивно.
для моего наивного сознания - пусто = нет. если умолчанием сделать /.*/ - тогда нормально.
Post Reply

Return to “Предложения и идеи”