Как заставить командную строку Windows обрабатывать одинарные кавычки так, как будто это двойные кавычки?

Как заставить командную строку Windows обрабатывать одинарные кавычки так, как будто это двойные кавычки?

Мой сценарий прост - я копирую примеры сценариев из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 не воспринимает одинарные кавычки как двойные. И в этом суть моего вопроса.

решение1

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

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

решение2

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

В программах Win32 разбиение командной строки на «слова» — многобайтовые строки символов с нулевым завершением, которые программы на языках C и C++ видят как переданный массив аргументов main()— является компетенцией библиотек времени выполнения этих программ. В Unix-системах и Linux разделение слов выполняется оболочкой, поскольку операционная система фактически работает в терминах массива строк аргументов. Это не относится к Win32. В Win32 сама операционная система работает в терминахкомандный хвост: аодинокийдлинная строка, которая все еще содержит все кавычки, которые изначально были введены в командной строке. (Естьявляется(Интерпретатор команд выполняет некоторую обработку этого хвоста команды перед его передачей целевой программе, но она не связана с разбиением на слова.)

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

commit -m 'Начальный коммит'

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

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

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

решение3

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

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

Связанный контент