Является ли консольная команда cd своего рода подстановочным знаком?

Является ли консольная команда cd своего рода подстановочным знаком?

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

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

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

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

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

решение1

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

Да, он существует и работает.

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

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

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

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

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

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


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

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

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

решение2

Идея cdкоманды смены каталога была придумана как часть 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 уровней.

решение3

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

решение4

Команда 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:

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