В UNIX-подобных системах оболочка sh
разделяет то, что вы вводите, на слова и передает каждое слово отдельно в качестве аргумента программе или встроенной команде, на которую ссылается первое слово (само имя команды является нулевым аргументом). Упрощенно, слова разбиты на каждый пробел. Таким образом,
cd ..
это два слова, но
cd..
только один. В UNIX нет команды с именем cd..
, поэтому последняя не работает. Первый вызывает 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 охватил почти все системы, так как программировать намного проще, поскольку только одна программа (оболочка) должна знать, как разбить командную строку на слова, в отличие от каждой программа, имеющая собственное домашнее решение.