суббота, 21 февраля 2015 г.

Почему у каждого диска есть свой собственный текущий каталог?

Это перевод Why does each drive have its own current directory? Автор: Реймонд Чен.

Комментатор Dean Earley спросил: "Почему есть 'текущий каталог' и 'текущий диск'? Почему бы их не объединить?"

Лаконичный ответ: потому что изначально у каждого диска был свой собственный каталог. Сейчас это не так, даже если иногда вам кажется иначе.

Хорошо, давайте развернём это утверждение. Вообще-то, вы уже знаете ответ на этот вопрос, вам только нужно сложить все кусочки вместе.

Заведите вашу машину времени на времена DOS 1.0. Каждый дисковый том был представлен буквой диска. На дисках вообще не было каталогов. Такая структура пришла из CP/M.

Поэтому программы эры DOS 1.0 не понимали и не умели работать с каталогами, они ссылались на файлы просто указанием буквы диска и имени файла. Например: B:PROGRAM.LST. Давайте запустим ассемблер (компиляторы в то время были для богачей) и соберём программу с исходным кодом на дискете A, а результат запишем на дискету B:

A>asm foo       расширение ".asm" у "foo" подразумевается неявно
Assembler version blah blah blah
Source File: FOO.ASM
Listing file [FOO.LST]: NUL листинг нам не нужен
Object file [FOO.OBJ]: B: сохранить объектник на диск B

Поскольку на запрос Object file мы указали только букву диска, то ассемблер возьмёт имя по умолчанию (FOO.OBJ), а итоговое имя файла для записи объектника будет B:FOO.OBJ.

Окей, теперь давайте выпустим DOS 2.0 с поддержкой подкаталогов. Предположим, вы хотите собрать исходный код A:\SRC\FOO.ASM и положить результат в B:\OBJ\FOO.OBJ. Вот как вы можете сделать это:
A> B:
B> CD \OBJ
B> A:
A> CD \SRC
A> asm foo
Assembler version blah blah blah
Source File: FOO.ASM
Listing file [FOO.LST]: NUL
Object file [FOO.OBJ]: B:
Ассемблер читает файл A:FOO.ASM и записывает файл B:FOO.OBJ, но поскольку текущий каталог - свой у каждого диска, то результаты идут в A:\SRC\FOO.ASM и B:\OBJ\FOO.OBJ - как нам и нужно. Если бы текущий каталог был глобальным, то мы не смогли бы указать ассемблеру, чтобы он поместил вывод в подкаталог. Иными словами, тогда любые программы DOS 1.0 (а в момент выхода DOS 2.0 других программ просто не было) были бы ограничены корневым каталогом, что в свою очередь означало бы, что никто не использовал бы подкаталоги, т.к. их программы не могли получить доступ к этим файлам!

С точки зрения DOS 1.0, изменение текущего каталога диска эквивалентно смене дискеты. "Ой, смотри, теперь на этом диске совсем другой набор файлов!"

Да, такая вот краткосрочная память.

Это запоминание текущего каталога для каждого диска сохраняется в системе и сегодня - хотя бы для командных файлов, поскольку Win32 не имеет концепции "текущего каталога диска". В Win32 у вас есть "просто" текущий каталог. Видимость, что текущий каталог - свой у каждого диска, поддерживается cmd.exe с помощью странных переменных окружения.

Dean продолжает: "Почему бы не слить эти два понятия? Сейчас для смены текущего каталога на конкретный мне нужно устанавливать и каталог и диск".

Ответ на второй вопрос звучит так: "Вообще-то эти понятия объединены в 1995 году. Это только cmd.exe делает вид, что они различны". И если вы хотите сменить и диск и каталог одной командой, то просто добавьте параметр /D к команде CHDIR:
D:\> CD /D C:\Program Files\Windows NT
C:\Program Files\Windows NT> _
Заметьте, что команда CHDIR позволяет вам не указывать кавычки вокруг путей с пробелами, поскольку у этой команды есть всего один аргумент, так что отсутствие кавычек не приводит к неоднозначности трактовки.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.