CmdPiОтвет повторяет полученную мудрость о том, что командные интерпретаторы Microsoft работают как оболочки UNIX. Именно так каждый голосовал ногами в 1980-х годах. Но на самом деле они этого не сделали и до сих пор не делают.
Имена команд могут и могут быть отделены от хвостов команд значительным количеством символов, а не только пробелами. Можно использовать символ равенства, например, или запятую. path=C:\DOSэто команда и хвост. Так же и есть dir,dos. Самый известный, можно использовать полную остановку. Отсюда и известный echo.трюк для вывода пустой строки в командном скрипте. Что менее хорошо известно, что echo;, echo+, echo=, echo(, echo,, echo[, echo], echo\, и echo/все будет делать то же самое (хотя и не всегда для некоторых из них).
Фактически, есть вызов API DOS ( int 21h,ax=6505h), который можно использовать для получения полного списка символов, которые являются так называемыми «символами завершения имени файла». И интерпретаторы команд DOS используют его, чтобы определить, какие символы заканчивают имя команды и начинают хвост команды. (Интерпретаторы команд Microsoft для не-DOS операционных систем, вероятно, просто передают набор символов.)
Обратная косая черта является одним из этих символов, и в интерпретаторах команд от Microsoft commandв MS-DOS до Microsoft cmdв Windows NT (включая IBM / Microsoft cmdдля OS / 2 по пути) можно выполнить, cd\и в результате интерпретатор команд изменит каталог к \. То, включен ли символ завершения в хвост команды, на самом деле зависит от команды. С cdкомандой это так. С dirи pathкоманды это не так . (Да, анализатор командной строки в интерпретаторах команд Microsoft ведет себя по-разному в зависимости от того, какая встроенная команда должна быть запущена.)
Это никогда не было задокументировано, хотя. Как я уже сказал: большинство людей в 1980-х годах проголосовали ногами за принятие парадигмы оболочки UNIX, хотя такие вещи, как разбор аргументов и цитирование, являются обширной заговорщической выдумкой, реализованной вовсе не интерпретатором команд, а библиотеками времени выполнения нескольких языков программирования. реализации для DOS; и вы обнаружите, что большая часть литературы уверенно заявляет, что пробел отделяет имя от хвоста, хотя на самом деле это не так. echo.Обычно описывается причуды и хитрости, и очень редко описывается как просто один случай общего синтаксиса, который командные интерпретаторы Microsoft использовали в течение примерно трех десятилетий.
Я рекомендую придерживаться здесь тенденции 1980-х годов и не полагаться на этот малоизвестный синтаксис. Используйте пробелы. Это то, что люди документируют. Это то, что сами IBM и Microsoft документируют. Это то, что утверждает народная мудрость. Это то, чего ожидают руководители UNIX. ☺
Мой командный интерпретатор шел с синтаксическими диаграммами и описаниями, которые есть в IBM doco. Однако вы обнаружите, что FreeCOM реализует это мало документированное поведение, как и интерпретаторы команд JP Software и commandOpenDOS. Документация JP Software рекомендует использовать пробел и описывает использование других символов завершения как «незаконных». Это, однако, одно из немногих мест, в которых фактически говорится в официальной документации, что есть альтернатива.
дальнейшее чтение