5

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

Например, следующая команда:

hg commit -m 'Initial commit'

не может быть вставлен, как в командной строке, потому что последний обрабатывает 'Initial commit' как две строки - 'Initial и commit' . Я должен редактировать команду после вставки, и это раздражает.

Можно ли поручить командной строке Windows обрабатывать одинарные кавычки аналогично двойным?

РЕДАКТИРОВАТЬ

После ответа JdeBP я провел небольшое исследование. Вот резюме:

  • Точка входа Mercurial выглядит так (это программа на Python):

    def run():
        "run the command in sys.argv"
        sys.exit(dispatch(request(sys.argv[1:])))
    
  • Итак, я создал крошечную программу на python для имитации обработки командной строки, используемой mercurial:

    import sys
    print sys.argv[1:]
    
  • Вот консольный журнал Unix:

    [hg@Quake ~]$ python 1.py  "1 2 3"
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  '1 2 3'
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  1 2 3
    ['1', '2', '3']
    [hg@Quake ~]$
    
  • А вот соответствующий журнал консоли Windows:

    C:\Work>python 1.py  "1 2 3"
    ['1 2 3']
    
    C:\Work>python 1.py  '1 2 3'
    ["'1", '2', "3'"]
    
    C:\Work>python 1.py  1 2 3
    ['1', '2', '3']
    
    C:\Work>
    

Хорошо видно, что Windows не рассматривает одинарные кавычки как двойные. И это суть моего вопроса.

3 ответа3

6

Символ цитирования не может быть изменен в командной строке command.com. Однако вы можете использовать PowerShell, который принимает как одинарные, так и двойные кавычки как символы кавычек. Они функционируют так же, как и в оболочках Unix. То есть одинарные кавычки не расширяют переменные, тогда как двойные кавычки будут.

Вы все еще можете столкнуться с проблемами с кавычками внутри кавычек. Например, на моем компьютере с Windows установлен клубничный Perl. Когда я запускаю perl -e 'print time, "\n" ' в PowerShell, я вижу вывод, такой как 1321375663SCALAR(0x15731d4) . Мне нужно экранировать двойные кавычки, чтобы он работал как положено: perl -e 'print time, \"\n\" '

1

Во-первых, командная строка не является интерпретатором команд. (Командная строка - это то, что отображается интерпретатором команд.) Во-вторых, ваш командный интерпретатор, его запросы и консоли Win32 не имеют к этому никакого отношения .

В программах Win32 разделение командной строки на "слова" - многобайтовые символьные строки с NUL-концевыми символами, которые программы на языках C и C++ видят как массив аргументов, передаваемый в main() - это область библиотек времени выполнения эти программы. В Unices и Linux оболочка выполняет разделение слов, потому что операционная система фактически работает в терминах массива аргументов. Это не относится к Win32. На Win32 сама операционная система работает в терминах командного хвоста: единственной длинной строки, которая по-прежнему содержит все кавычки, которые изначально вводились в командной строке. (Существует некоторая обработка делается для этой команды хвост с помощью интерпретатора команд , прежде чем он передается в целевой программе, но это не связано с расщеплением слов.)

В вашем случае библиотека времени выполнения вашей hg программы доставляется с помощью этой команды tail:

commit -m 'Initial commit'

Библиотека времени выполнения, с которой была скомпилирована эта программа, не знает, что вы подразумевали одну кавычку в качестве символа пробела, потому что это не является соглашением. Соглашение имеет дело только с двойными кавычками (и обратными слешами перед двойными кавычками).

Это соглашение встроено в библиотеку времени выполнения, которая была предоставлена вместе с компилятором, используемым для создания программы. Если вы хотите изменить соглашение, вам нужно будет заново связать каждую отдельную программу, которую вы хотите запустить таким образом, со специальной библиотекой времени исполнения, которая также распознает одинарные кавычки. Очевидно, что это нецелесообразно (если это не все программы Cygwin).

Гораздо более практичный подход - делать то, что вы уже делаете: признать, что Windows - это не Unix, и соответствующим образом скорректировать примеры перед их использованием.

0

Я совершенно уверен, что вы не можете редактировать способ, которым DOS анализирует команды. Это присуще базовому программированию.

Единственное решение, которое я могу придумать, чтобы ускорить процесс, это оставить окно «Блокнот» открытым и запустить «Найти и заменить» - заменяя все одинарные кавычки на двойные. А потом скопировать-вставить в DOS оттуда.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .