В UNIX-подобных системах оболочка sh
разделяет то, что вы вводите, на слова и передает каждое слово отдельно в качестве аргумента программе или встроенной команде, на которую ссылается первое слово (само имя команды является нулевым аргументом). Упрощенно, слова разбиты на каждый пробел. Таким образом,
cd ..
это два слова, но
cd..
только один. В cd..
UNIX нет именованных команд, поэтому последняя не работает. Первый вызывает cd
с единственным аргументом ..
, изменяя один каталог вверх. Для более сложного примера,
echo foo bar baz quux
анализируются в четыре слова echo
, foo
, bar
, baz
, и quux
которые затем передаются в echo
команду в качестве аргументов. Количество пробелов между ними теряется и echo
будет напечатано
foo bar baz quux
так как он всегда вставляет один пробел между каждым аргументом.
В Windows, DOS и CP / M оболочка COMMAND.COM
анализирует имя команды как самый длинный префикс из того, что вы набрали, пока не будет достигнут пробел или пунктуация (это тоже упрощение). Затем команда выполняется со всей строкой, введенной вами в качестве аргумента. Указатель указывает, где интерпретатор команды считает, что имя команды закончилось. COMMAND.COM
не разбивает командную строку на аргументы, если программа хочет, чтобы это произошло, она должна сделать это сама.
Например, в cd ..
оболочке решается, что cd
это имя команды, которая оказывается встроенной командой. Встроенная команда выполняется со строкой аргумента cd ..
и информацией о том, что первые два символа образуют имя команды. Аналогично, cd..
оболочка решает, что cd
это имя команды, и передается ..
как имя операнда. Команда cd
пропускает имя команды, удаляет остаток из пробела и затем пытается перейти в упомянутый каталог.
Аналогично для
echo foo bar baz quux
оболочка вызывает echo
команду с echo foo bar baz quux
аргументами и echo
печатает должным образом
foo bar baz quux
Это причина, почему cd..
работает в DOS, но не в UNIX.
Обе конструкции имеют свои плюсы и минусы, хотя стиль UNIX охватил почти все системы, так как программировать намного проще, поскольку только одна программа (оболочка) должна знать, как разбить командную строку на слова, в отличие от каждой программа, имеющая собственное домашнее решение.