http://habrahabr.ru/post/221105/
Давным-давно, когда разрабатывалась файловая система Unix, в ней появились «псевдо-файлы»
.
и
..
, чтобы упростить перемещение между каталогами. Кажется,
..
был добавлен в Версии 2, когда файловая система стала иерархической (в первой версии она была устроена совсем по-другому). Но эти «псевдо-файлы» засоряли вывод
ls
, и то ли Кен, то ли Деннис добавил в код
ls
простую проверку:
if (name[0] == '.') continue;
На самом деле программы тогда писались на ассемблере, но суть проверки была в точности такой.
Правильнее было бы реализовать эту проверку более развёрнуто:
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;
— но какая разница, главное что всё работало.
У этого было два далеко идущих последствия.
Во-первых, был создан прецедент для подобных «небрежных оптимизаций» в Unix, и уйма других ленивых программистов аналогичным способом насажали баги в свои программы: в частности, файлы, начинающиеся с точки, зачастую игнорируются там, где должны бы обрабатываться.
Во-вторых, и это намного хуже, «скрытые файлы», начинающиеся с точки, были восприняты как «фича». Уйма ленивых программистов стали создавать такие файлы в домашнем каталоге каждого пользователя. На моей машине установлено не так много программ, но в моём домашнем каталоге около сотни скрытых файлов, и про большинство из них я даже не догадываюсь, зачем они нужны, и нужны ли вообще. Каждый поиск файлов в моём домашнем каталоге замедляется в разы из-за всего этого невидимого мусора.
Я уверен, что «скрытые файлы» появились в Unix
по ошибке, как непредвиденный результат той «оптимизации» в
ls
.
Сколько багов, сколько впустую сожжёных тактов процессора, сколько человеческой досады можно объяснить лишь тем, что 40 лет назад авторы Unix сэкономили полстрочки кода?
Вспоминайте об этом случае каждый раз, когда в вашем собственном коде вам захочется «срезать угол».
(Многие утверждают, что файлы с точкой в системе необходимы. Да, сами файлы необходимы, но точка в их именах — нет. Их гораздо удобнее было бы хранить в
$HOME/cfg
или в
$HOME/lib
; и именно так мы сделали в Plan 9, в которой «скрытых файлов» нет. Мы умеем учиться на своих ошибках.)