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

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

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

Post by Smitis » Thu 30 May, 2013 14:51

При передачи строки командному процессору функция 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: 11145
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 73 times

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

Post by John Doe » Thu 30 May, 2013 15:00

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

Это?

Code: Select all

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

2useven10
Posts: 2984
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Thu 30 May, 2013 15:02

чем не устраивает System.QuotedName ?

User avatar
John Doe
Бюрократ
Posts: 11145
Joined: Wed 27 Apr, 2005 20:42
Has thanked: 12 times
Been thanked: 73 times

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

Post by John Doe » Thu 30 May, 2013 15:04

System.QuotedName - это про вставку, а не про запуск

User avatar
t-rex
Страшный и ужасный
Posts: 4871
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Contact:

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

Post by t-rex » Thu 30 May, 2013 15:05

лучше им в суппорт напиши, а для cmd эти кавычки нужны, уже много раз пытались тот код менять, только текущий вариант нормально работает.

Smitis
Posts: 1455
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 13 times
Been thanked: 23 times
Contact:

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

Post by Smitis » Thu 30 May, 2013 16:10

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

2useven10
Posts: 2984
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Thu 30 May, 2013 19:15

Так я предлагаю - опционно. По умолчанию будет включено, старое поведение не сломается
можно 3-state: on(default), off, other(off если comspec==tcc)

User avatar
DrKnS
Posts: 4590
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 116 times
Contact:

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

Post by DrKnS » Thu 30 May, 2013 19:36

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

User avatar
HaRT
Moderator
Posts: 8051
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

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

Post by HaRT » Thu 30 May, 2013 19:51

2useven10 wrote:можно 3-state: on(default), off, other(off если comspec==tcc)
Завязываться на имена нестандартных шеллов как-то не комильфо. Да и легко запутаться с их распознаванием: есть ли расширение, есть ли путь и т.п. Сколько пользователей по нескольку раз в день меняют COMSPEC?
Фар есть инструмент, а не нянька. © 2009 DrKnS

2useven10
Posts: 2984
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Thu 30 May, 2013 19:56

меняют наверное немногие, но те у кого установлены обе оболочки запросто могут запустить фар в любой из них.
add: если DrKnS прав, чистый off вообще вреден.

Smitis
Posts: 1455
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 13 times
Been thanked: 23 times
Contact:

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

Post by Smitis » Thu 30 May, 2013 19:59

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

К сожалению, выбор командных процессоров под Виндой очень невелик
Разум когда-нибудь победит.

User avatar
HaRT
Moderator
Posts: 8051
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

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

Post by HaRT » Thu 30 May, 2013 20:16

2useven10 wrote:меняют наверное немногие, но те у кого установлены обе оболочки запросто могут запустить фар в любой из них.
Ну тогда надо для третьего состояния крыжика ещё задавать список значений COMSPEC, для которых off.
Фар есть инструмент, а не нянька. © 2009 DrKnS

2useven10
Posts: 2984
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Thu 30 May, 2013 20:22

достаточно ...NotQuotedShell -- список или regex, по-умолчанию пусто.

User avatar
HaRT
Moderator
Posts: 8051
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

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

Post by HaRT » Thu 30 May, 2013 20:38

2useven10 wrote:достаточно ...NotQuotedShell -- список или regex, по-умолчанию пусто.
Как-то не вполне стройно, ведь пустой регэксп находится в любой строке. Может лучше так?: назвать QuotedShell, трактовать как регэксп, по умолчанию пусто (то есть везде закавычивать). Кому надо список, задаст через ‘|’; кому надо никогда не закавычивать, напишет какой-нибудь недопустимый символ, например “>”.
Фар есть инструмент, а не нянька. © 2009 DrKnS

2useven10
Posts: 2984
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

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

Post by 2useven10 » Thu 30 May, 2013 20:57

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

Smitis
Posts: 1455
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 13 times
Been thanked: 23 times
Contact:

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

Post by Smitis » Fri 31 May, 2013 08:13

Увы. Эксперименты показали, что для CMD кавычки лучше оставить. Перенаправление, пайпы, всё это нормально работает до тех пор, пока в пути к командному файлу не втретится пробел (т.е. кавычки будут первым символом). Тут cmd лажается :(
Разум когда-нибудь победит.

Post Reply

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