О срезании углов

Original author: Rob Pike
  • Translation
Давным-давно, когда разрабатывалась файловая система 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, в которой «скрытых файлов» нет. Мы умеем учиться на своих ошибках.)
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 50

    +14
    (Многие утверждают, что файлы с точкой в системе необходимы. Да, сами файлы необходимы, но точка в их именах — нет. Их гораздо удобнее было бы хранить в $HOME/cfg или в $HOME/lib; и именно так мы сделали в Plan 9, в которой «скрытых файлов» нет. Мы умеем учиться на своих ошибках.)

    .svn .git
    В хоме хранить и не будет проблем?
      +4
      Учитывая, как невидимое может неожиданно стать видимым — может, и меньше было бы проблем, будь эти каталоги в отдельном месте.
        +12
        Сейчас можно взять и просто скопировать каталог с полной копией репозитория на флешку. Если хранить эти каталоги в отдельном месте, то это будет очень неудобно.
          +1
          Как уже написали выше будут проблемы с переносом или сменой пути к репозиторию и каждому юзеру придётся хранить свою копию служебной информации.
            –1
            Если у вас несколько пользователей работают с одной и той же копией репозитория, то по-моему, вы сами себе создаёте ту самую проблему, которую SVN пытается решить.
              +1
              Это я к каталогам где кроме svn up ничего не нужно. Так-то у каждого юзера в любом случае должна быть своя копия и не важно где будет лежать служебная информация.

              В любом случае хранить информацию о репозитории отдельно от рабочей копии неудобств больше создаёт чем пользы. Есть файлы которые можно безболезненно перенести в home, а есть которые нет и для них очень кстати пришлась точка в имени.
                +2
                Совершенно согласен! Но как из этого следует то, что названия должны начинастья с точки?
                  +1
                  А с чего им стоит начинаться, чтобы сохранить переносимость между разными файловыми системами и при этом ясно давать понять, что это служебная директория?
                    +5
                    DontDeleteMe_%filename%
                    Service_%filename%
                    !%filename%
                    WhoWillRemoveMeThatLamer_%filename%
                      0
                      Вот именно! Ничем не лучше. К тому же спецсимволы типа. и! при алфавитной сортировке выше.
        +7
        Не хватает тега «теория заговора».
        Я тоже против мусора в ~, но это скорее следствие недоработки FHS, чем конспирологической истории про точку.
        Авторы некоторых программ взялись за ум и уже начали складывать свои файлы в ~/.config, что очень радует.
          0
          … А некоторые — в ~/.local/… А смысл? Меня несколько раз в последнее время бесило, когда авторы «на ровном месте» начинали ломать, в т.ч., расположение каталога с настройками. Чем не нравился вариант, когда точки — в домашнем каталоге? Единого-то каталога, как в винде, — уже не будет (да и в винде тоже зоопарк)…
          +7
          Мусор в ~ только из-за того, что разработчики игнорируют стандарт Freedesktop.org.
            +2
            Эта часть стандарта появилась далеко не сразу :) И многие по привычке следуют старым традициям.
            +22
            Где теперь этот Plan 9 и его прекрасная Гленда?
              +1
              Работает в ряде применений и кое-где довольно успешно. Реквестирую больше информации о Plan9, InfernoOS и других подобных технологиях, созданных между прочим создателями и идеологами Unix. Там действительно есть чему поучиться
              +7
              Вот честно, без последнего предложения смысл поста вообще не ясен.

              Допустим, что скрытые файлы появились по ошибке, но если этой ошибкой стали пользоваться => это удобно для большинства.
              Всякое удобное решение можно довести до абсурда. Так и произошло. Является это большой проблемой, которое нельзя решить в рамках текущей архитектуры? — Нет, уже дали ссылку на Freedesktop.

              Итог — проблемы не существует, подчеркиваю «проблемы». Более того, я не уверен, что отсутствие привычного инструментария — плюс системы.
                +13
                «это удобно для большинства» не значит, что так надо делать. Вон, выкидывать бычки в окно автомобиля тоже удобно для большинства.
                  +2
                  Аналогия не корректна. Вот если вы приведете пример, почему использование скрытых файлов разрушительно для всего остального — тогда да, проводить подобные параллели вполне возможно, в противном случае это — софизм.
                    +8
                    Это была претензия не к методу, а к аргументации «это удобно для большинства».
                    Как правило, это значит, что автор и его окружение не знает корректного решения поставленной задачи, и используют то, которое знают и оно кажется им удобным, из-за чего нового решения они не ищут. Другими словами — это локальный максимум, а не глобальный.

                    Касательно претензий к методу:
                    Среди способов скрыть файл, среди известных мне ОС — точка в начале файла — самый удобный способ. Но. Есть ли смысл вообще скрывать файлы?
                    Вот разрушительные примеры — thumbs.db в каждой папке Win XP и .DC_store (или как-то так) в архивах, созданных под Mac OS. Из-за них приходится делать кучу бессмысленных действий при работе с архивами.
                    В более поздних версиях Windows используется глобальное хранилище где-то в недрах профиля пользователя. И проблем больше нет.
                    А скрывать .git в репозиториях — смысла нет вообще, имхо. Мы разработчики и мы понимаем, зачем это нужно и что там лежит. Но если файл видим — вероятность его случайно снести по забывчивости или незнанию — намного ниже.

                      0
                      «А скрывать .git в репозиториях — смысла нет вообще, имхо. Мы разработчики и мы понимаем, зачем это нужно и что там лежит.»

                      С гитом — вполне согласен, одну папку можно пережить, более того, считаю полезным залезать в эту папочку для расширения понимания, как реально настроен проект, а вот для svn — чур меня. Я не хочу видеть 3 полезных каталога и 1 бесполезный и нафиг мне нужный.

                      «Но. Есть ли смысл вообще скрывать файлы?
                      Вот разрушительные примеры — thumbs.db в каждой папке Win XP и .DC_store (или как-то так) в архивах, созданных под Mac OS. Из-за них приходится делать кучу бессмысленных действий при работе с архивами.»

                      Убивать всю идею туалета из-за того, что кто-то туда сливает технические отходы — излишне сурово. К примеру, я считаю вполне нормальным держать папочку tmp в качестве скрытой, ровно как каталог с локальными настройками всех приложений

                        +1
                        Иногда имеет смысл принять волевое решение и оштрафовать всех, кто сливает технические отходы в туалет. То есть перестать скрывать файлы/папки, кроме специализированных. В принципе, я бы даже папку с конфигурациями не стал скрывать.
                        0
                        Но если файл видим — вероятность его случайно снести по забывчивости или незнанию — намного ниже.

                        Добавлю ещё, что если файл видим — вероятность его случайно оставить по забывчивости или незнанию — намного ниже.
                        А такая случайность может обойтись довольно дорого — ссылаясь опять же на habrahabr.ru/post/70330/
                        0
                        Вот вам в качестве конкретного примера: мой домашний каталог монтируется с центрального сервера, и поэтому жёстко ограничен в размерах.
                        Фаерфокс сваливает в ~/.mozilla все свои данные, включая кэш браузера, которым время от времени превышает мою квоту.
                        Никакой надобности хранить все данные в одном месте у Фаерфокса нет, и под Windows он вполне корректно распределяет свои файлы по папкам Local и Roaming.
                        Но что поделать: в Windows это разделение появилось во времена NT35, лет эдак двадцать назад, а в Ubuntu его нет до сих пор.

                        Не потому ли, что на скрытые файлы просто никто не обращает внимания, а значит, и не задаётся вопросом, где их стоит хранить?
                          0
                          >Фаерфокс сваливает в ~/.mozilla все свои данные, включая кэш браузера, которым время от времени превышает мою квоту.

                          Настройте размер кэша
                            0
                            Вариантов обойти проблему много: можно, например, руками заменить каталог с кэшем на симлинк на локальный каталог.
                            Речь о том, что проблемы с файлами с точкой есть.
                              +2
                              Ну похоже есть проблема в традиции хранить всякие локальные файлы в домашней дирректории
                                –1
                                А при чем тут файлы с точкой? Если бы были без точки ($HOME/cfg или $HOME/lib, как вы упомянули в топике), вам что, легче бы было? ;)
                                  +1
                                  Если бы в линухах были $HOME/local и $HOME/roaming, как в Windows, то мозиллописатели бы неминуемо задумались, в котором из этих каталогов лучше хранить кэш.

                                  Вместо этого в линухах творческая анархия, и каждое приложение создаёт в $HOME собственный каталог — один фиг ведь никто его не видит, значит никому он и не мешает, правда?
                                    +1
                                    >Если бы в линухах были $HOME/local и $HOME/roaming, как в Windows, то мозиллописатели бы неминуемо задумались, в котором из этих каталогов лучше хранить кэш.

                                    Что-то я никак в толк не возьму как бы это помогло в вашей ситуации, когда весь «хомяк» монтируется как сетевой ресурс. Поясните?
                                      0
                                      Ну вообще-то такой стандарт есть:
                                      Freedesktop.org XDG Base Directory Specification

                                      Который описывает директории ~/.cache, ~/.config и ~/.local. На практике, как минимум в Ubuntu/Debian, всё больше и больше программ соответствуют этому стандарту.
                      +5
                      История возникновения традиции занятна. Но мне кажется, что здесь бага превратилась в однозначно полезную фичу. В любом случае скрытые (для ls) файлы полезно иметь, вопрос лишь в том, как это реализовать: через ad hoc атрибуты файла или в виде некоторой договоренности об именовании файлов. Сам я привык ко второму варианту и не хотел бы от него отказываться, а начинающим пингвиноводам с самого начала говорю: «файлы с точки — для заточки».
                        +5
                        Я бы не назвал её полезной. Сокрытие файлов я отключаю везде (кроме shell glob) и вот почему:
                        1. Мне не хочется внезапно узнать, что в том месте, в которое я что-то скопировал/заархивировал/..., оказался лишний мусор.
                        2. Ещё меньше мне хочется узнать, что я пропустил какой-то нужный файл, потому что ls его не показывает, а оболочка по-умолчанию эти файлы не добавляет при раскрытии glob.
                        3. Гораздо проще посмотреть все файлы, а не гадать, почему какой-нибудь rmdir отказался работать.
                        4. В домашнем каталоге огромная куча нужных файлов начинается с точки. Ещё есть .hg*/.git* (не только каталоги). И мне всё это надо редактировать.

                        Поэтому я считаю, что скрытых файлов не должно быть вообще. Shell globbing здесь стоит отдельно: чтобы пользовательские настройки ничего не сломали надо в начале каждой функции писать «emulate -L zsh». Что закономерно приводит к сбросу настроек для globbing. Так что проще привыкнуть, чем писать в два раза больше одинаковых строк в каждой функции.
                        –6
                        «Мы умеем учиться на своих ошибках.»
                        Лучше было бы сказать
                        Мы умеем учиться на чужих ошибках.
                          +15
                          Почему же?
                          Роб Пайк, автор заметки, и Кен Томпсон с Деннисом Ритчи, авторы той проверки в ls, — участвовали в разработке и Unix, и Plan 9.
                          +2
                          Как раз пару дней назад была заметка на ту же самую тему в The Old New Thing — про set " в Windows.
                          См. также, как делать touch через copy и почему find "" ничего не находит, когда должен бы находить всё
                            0
                            Вроде бы программы посвежее научились хранить свои данные и конфиги в .config, а не создавать в ~ папки и файлы. Хотя у меня, конечно, штук пять-десять таких файлов наберется.
                              +1
                              Подозреваю, что оригинальный код намного быстрее, не так ли? Впрочем, не могу придумать ситуацию, где бы копеечное ускорение в ls имело бы какую-то объективную ценность.
                                +6
                                Подозреваю, что скорость работы ls намного больше завязана на скорость ввода-вывода, чем на скорость фильтрации полученных строк.
                                  +2
                                  Если это только ради скорости, то вот такой вариант лишь немногим уступает (да и то, только если имя начинается с точки), избегая при этом «побочного эффекта»:
                                  if (name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) continue;

                                  Но читается это, конечно, уже гораздо хуже. Лично я бы выбрал strcmp.
                                  –1
                                  Можно ссылку на источник, где написано, что такая проверка сделана не нарочно? K&R в моих глазах всегда были думающими программистами, не допускающими таких случайностей.
                                    +4
                                    Свидетельства их коллеги по разработке Unix вам недостаточно?
                                    +15
                                    В винде ещё хуже. Когда линуксоиды портируют софт под форточки, возникают нескрытые "C:\Users\Name\.wtf\...". Другим, исконным виндузятникам, больше нравится пихать в "C:\Users\Name\Documents\MyCoolSoftware\..." (это те же, кто непременно лезет в панель быстрого запуска и на рабочий стол). Есть особо извращённые любители "C:\uberimportantsoftware\...". На стандарты забивания папок AppData\Roaming, AppData\Local, C:\ProgramData накласть всем и вся. Стандартов для «редактируемых юзером конфигов» не существует вовсе (а чо, винда же, у нас только гуй). Теперь ещё пошла мода пихать приложения в AppData — а чо, на Program Files какие-то странные права навешаны, мешаются только.

                                    И вы после этого жалуетесь на жалкие скрытые файлы в домашней директории? Да вы зажрались.
                                      +3
                                      При этом C:\Users\Name\Documents прибито гвоздями в программе (а как-то раз видел и Name прибито было) и не обращает внимания даже на то, что не C:\, а уж остальное и подавно не там. А конфигов там нет — всё в реестре валяется (второе кольцо ада).
                                        +5
                                        Строго говоря, в винде засрано всё: рабочий стол, папка документов, все мыслимые и немыслимые папки настроек, список приложений, реестр, панель быстрого запуска, главное меню, контекстное меню, типы файлов, панель уведомлений, переменные окружения, сервисы, автоматический запуск, расширения оболочки… ВСЁ. Даже если Майкрософт прикладывает все усилия, чтобы софт куда-то не лез (прикреплённые на панели задач приложения, например), туда всё равно лезут.

                                        Стандарты-рекомендации есть, но на них кладёт такое количество софта, причём очень важного и популярного софта, что сопротивление бесполезно. Чем больше ставишь софта, тем сильнее ощущение свалки. Вроде бы, всё работает и даже более-менее нормально, но ощущение грязи не вывести ничем.

                                        P.S. На днях выяснил, что Visual Studio читает шаблоны из "%USERPROFILE%\Documents". И этот баг объявлен фичей. Это ведь даже не «ГовноСофт имени Василия Пупкина», это сам Майкрософт.
                                          +4
                                          Инсталлятор VS и SQL как вспомню, так вздрогну.
                                            0
                                            Когда слышу «инсталлятор VS», то ничего не могу с собой поделать — сразу вспоминаю инсталлер VS 6.0 (наверное, помирать буду — и то вспомню). После окончания установки то ли самой студии, то ли какого-то сервис-пака к ней всплывало окошко «Хотите перезагрузить компьютер сейчас или сами перезагрузите позже?» — и 2 варианта ответа. И при выборе «Позже» всплывало окно «Нужно перезагрузить компьютер», и на этот раз одна-единственная кнопка «ОК». И зачем спрашивали? :D
                                              0
                                              Ну нельзя же сразу так в лоб, как, например, DirectX, надо дать видимость альтернативы.
                                                0
                                                Главное подготовить клиента, что бы уж наверняка был готов ))))))))))))))))

                                      Only users with full accounts can post comments. Log in, please.