1

Во время разработки какого-либо приложения (хотя это не вопрос разработки) мне было интересно, является ли команда cd используемая в Windows, подстановочной или кроссплатформенной командой. Я посмотрел на стол с командами для Unix/Linux и MAC OS X, и оказалось, что он там есть. Я не многопользовательский пользователь, поэтому я спрашиваю, может ли кто-нибудь с опытом работы в разных ОС сказать мне:

  1. Если эта команда действительно существует и работает
  2. Если он имеет такую же функциональность (смени каталог)
  3. Если есть какие-либо проблемы с его использованием
  4. Если в какой-либо ОС есть другая команда командной строки, которая делает то же самое лучше / более тщательно / более свободно используемым способом.

Заранее спасибо!

(PSI не уверен на 100%, принадлежит ли этот вопрос этому сайту или другому сайту stackexchange ...)

(PPS Любая помощь в маркировке это будет оценено!)

5 ответов5

5

Идея команды cd change directory была придумана как часть Unix в 1969 году. Это кратко, как и большинство других команд Unix, таких как ls , rm , sed и так далее. Это также соответствовало древовидной файловой системе, изобретенной как часть Unix, где даже устройства были файлами в /dev . Легко забыть, что до Unix было не так много операционных систем с древовидной файловой системой с каталогами, которые обычные пользователи могли легко создавать. Обычно у вас есть (в лучшем случае) куча файлов и странные утилиты IBM, такие как IEBGENER, для управления ими.

Что делает cd , это изменяет текущий каталог текущего процесса, в данном случае оболочку, которая влияет на то, как операционная система будет интерпретировать относительные имена файлов, то есть те, которые не полностью определены в корне / файловой системы. Текущий каталог наследуется от родительского к дочернему процессу.

Существует пара больших различий в семантике cd в системах Unix или Linux по сравнению с системами Windows. Во-первых, что должен делать cd без операнда? В Unix или Linux он переносит вас в домашний каталог. В Windows cmd.exe «s cd просто сообщает текущий каталог. Кроме того, Windows не имеет однокорневого корня, у нее есть буквы дисков, и вы можете иметь текущий каталог на каждом из них, хотя закулисная реализация заключается в том, что Microsoft бросила это через стену в пространство приложений: каждый процесс несет в себе некоторую скрытую среду переменные со странными именами, такими как =C: приложение отвечает за поддержание актуальности.

Некоторые команды cd лучше других, но это может быть вопросом вкуса. Оболочка C представила идею CDPATH которая работает как переменная PATH , но находит каталоги вместо исполняемых файлов. Оболочка C также представила стеки каталогов, позволяющие pushd или popd текущий каталог. При написании своей собственной оболочки C я скопировал все это, добавил опцию, позволяющую пользователю решать, что должен делать cd без операнда, и функцию, которую клиент предложил, если вы наберете более 2 точек, как в cd .... подняться n-1 уровней.

2

Да, cd - это команда * nix, которая работает в Linux, OSX и других ОС * nix.

1

Просто любопытство: AFAIR, в Novell DOS (довольно много лет назад) cd . остался в текущем каталоге, cd .. перешел в родительский каталог, cd ... поднялся на два уровня в иерархии, cd .... три уровня и так далее.

1

Если эта команда действительно существует и работает

Хм, да, это существует и работает.

Если он имеет такую же функциональность (смени каталог)

Да; Да, это так. Это не означает, что кто-то не может просто создать программу (например, cd.exe), которая делает что-то еще, но обычно это команда, встроенная в оболочку и изменяющая текущий каталог.

Если есть какие-либо проблемы с его использованием

Какие проблемы? . и .. , его синтаксис довольно прост. Единственная сложность - при смене текущего каталога на других томах (буквах дисков). Кроме того, расширения команд в Windows немного расширяют его использование, но ничего такого, что могло бы вызвать реальные проблемы.

Если в какой-либо ОС есть другая команда командной строки, которая делает то же самое лучше / более тщательно / более свободно используемым способом.

На самом деле, нет. Могут быть и другие команды, но cd хорош и короток и делает свое дело. Помимо изменения текущего диска в дополнение к каталогу (например, cd /d t:\blah), как именно можно улучшить изменение текущего каталога?


Это не совсем по теме (хотя и связано), но, видимо, некоторые люди не могут смириться с тем, что команда CD не обязательно должна быть встроена в оболочку. Дело в том, что это не так ; это может быть внешняя программа. Некоторые операционные системы облегчают это, другие затрудняют, а некоторые даже делают невозможным, но факт в том, что он может быть внешним и не всегда должен быть встроен, как некоторые заставили бы вас верить. Например, в 32-разрядных версиях Windows, включая XP и 7, вы можете использовать тот факт, что консольная подсистема (то есть, как программы текстового режима поддерживаются и запускаются в Windows) поддерживает старое прерывание «DOS» 0x21— да, даже в cmd , а не просто `команда. (Это не будет работать в 64-битных версиях Windows, потому что они потеряли много обратной совместимости.)

Например, вы можете сохранить нижеприведенный скрипт отладки как c.scr и скомпилировать его, запустив debug < c.scr из командной строки. Он создаст файл .com который вы можете использовать для изменения текущего каталога.

a
mov si,82
mov dl,[si]
or dl,20
sub dl,61
mov ah,e
int 21
mov dl,[si]
cmp dl,d
jz 119
inc si
jmp 10f
xor dl,dl
mov [si],dl
mov dx,82
mov ah,3b
int 21
mov ah,4c
int 21

n c.com
rcx
28
w
q

(Обратите внимание, что он не поддерживает длинные имена файлов, поэтому вам нужно будет использовать версию 8.3 . Он также меняет текущий диск, так что вы можете изменить каталог на другой диск за один ход, но он делает это очень простым способом и не выполняет никакой проверки ошибок, поэтому пытается перейти в каталог, который начинается с Буква, для которой существует диск, работать не будет. То есть c c:\windows будет работать так же, как c \windows , но c asd не будет работать, если у вас есть диск A: если только в нем не содержится каталог с именем asd . Вы можете расширить его и добавить проверку ошибок и тому подобное, если хотите, но это доказывает мою точку зрения о возможности того, чтобы cd был внешним в Windows.)

Вы также можете сохранить следующую программу Pascal (например, как c.pas) и скомпилировать ее с помощью Turbo Pascal или GO32-версии компилятора FreePascal (32-разрядная версия не будет работать, поскольку она использует обычный Windows API):

program cd;
begin
  chdir(paramstr(1));
end.

Опять же, просто запустите его, чтобы изменить текущий каталог (например, `c.exe" c:\program files "- да, длинные foldernames будут работать, но будут автоматически преобразованы в имена 8.3 после выполнения).

1

Команда cd в DOS и Windows очень похожа на команду для Unix/Linux, и на то есть веская причина: вся концепция каталогов была скопирована с Unix.

Первой системой, которая запускала MS-DOS (маркированную как PC-DOS), был IBM PC. Жесткого диска не было - хранилище находилось на дискетах емкостью 180К и 360К. С такими ограниченными носителями вам не нужна сложная схема именования файлов. Таким образом, полное имя файла было просто обозначением диска, за которым следовало имя файла 8.3, такое как a:autoexec.bat или b:advent.exe .

MS-DOS 2.0 пытался решить множество подобных проблем, копируя функции из Unix. Это включает в себя каталоги и команды для работы с ними. Одна проблема заключалась в том, что MS-DOS уже использовала символ / для указания необязательных аргументов; Вот почему Windows и Unix используют разные символы разделителя пути.

Одним из важных отличий является то, что Unix имеет единую иерархию каталогов без обозначений дисков. Приспосабливая команду cd к MS-DOS, Microsoft пришлось изобрести новую семантику для понятия "текущий каталог", которая учитывает обозначение диска. Чтобы максимизировать обратную совместимость (чтобы такие имена, как a:something то означало что-то разумное), они изобрели понятие "текущий диск" и постановили, что у каждого диска есть свой "текущий каталог". Поэтому, когда вы меняете "текущий каталог", вы действительно меняете текущий каталог для текущего диска. Обычно такого рода детали не о чем беспокоиться. Но это объясняет, почему когда вы находитесь на c:\somedir и делаете cd d:\otherdir кажется, ничего не происходит. Что случилось, что вы изменили текущий каталог для вас d: диск без изменения текущего диска; Вы должны ввести команду d: чтобы это произошло.

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