Пользователям Unix хорошо известно, как в этой ОС создаются скрытые файлы: если перед названием поставить точку, то набранная без специального параметра ‘-a’ команда ls (вывод списка файлов) не покажет их. Это считается одним из непоколебимых стандартов, и реализовано во всех современных ответвлениях Unix – в том числе FreeBSD, Linux и Mac OS X. Но многие ли знают, что создана эта возможность была не преднамеренно, а случайно – из-за недоработки в коде Unix?

Рассказал об этом Роб Пайк – бывший сотрудник лаборатории Bell Labs, где разрабатывался Unix. Пайк известен как один из авторов так и не выпущенного “духовного наследника Unix” под названием Plan 9, но нынче он работает в Google, где руководит разработкой языка программирования Go.

На своей странице в Google+ Пайк пишет, что когда в Unix добавили иерархическую файловую систему (а это произошло с появлением Version 2), понадобилось как-то обозначать текущий каталог и каталог, в котором он содержится. Обозначения “.” и “..” сегодня известны многим пользователям – они используются и в ссылках в интернете, и в командах FTP. Две точки в качестве обозначения родительского каталога задействованы даже в DOS и Windows – тоже с незапамятных времён.

Чтобы команда ls среди прочих имён файлов, находящихся в текущем каталоге, не выводила эти обозначения, создатели Unix (был ли это Кен Томпсон или Деннис Ритчи, Пайк уже не уверен) добавили проверку. Она была написана на ассемблере, но для простоты Пайк приводит её вариант на Си:

if (name[0] == '.') continue;

Этот код проверяет первый символ строки name на соответствие точке. Чтобы условию удовлетворяли только строки, состоящие из одной или двух точек, стоило вместо этого написать что-то вроде

if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;

Но, видимо, писать такие длинные условия на ассемблере было долго, и кто-то из отцов-основателей сэкономил время.

Поскольку пользователи в те времена были не многим менее сведущими в вопросах устройства ОС, чем сами её создатели, эту ошибку очень быстро научились эксплуатировать. Если поставить перед названием файла точку, команда ls пропустит файл при печати списка. Со временем это стало официальным способом создания скрытых файлов.

Если вы пользуетесь системой на основе Unix, можете открыть терминал, зайти в домашний каталог (‘cd ~’) и написать ‘ls -a’ или ‘ls -la’, и увидеть, какое количество скрытых файлов с настройками насоздавали установленные программы. Обратите внимание и на то, что наличие параметра ‘-a’, заставляющего команду ls отменить историческую проверку на начало с точки, приведёт к тому, что в списке появятся и ссылки на текущий и родительский каталоги: “.” и “..”.