Почему mkdir не имеет набора флага-p по умолчанию для обеспечения вложенного создания каталога?

. и источник несколько отличается в zsh, по крайней мере (это - то, что я использую), потому что

source file

Работы, в то время как

. file

не делает, этому нужно

. ./file
11
31.10.2011, 12:36
5 ответов

Это - дополнительная функция, которая не всегда желаема - особенно в сценариях. Рассмотрите следующие недостатки в случае сценариев:

  • О том, что каталог уже существует, не сообщают: Если сценарий, как предполагается, помещает некоторые файлы в недавно созданный каталог, и тот каталог уже существует и содержит файлы, сценарий может сделать большую путаницу. (Это будет трудно для позже отфильтровывания файлов, которые были помещены туда сценарием.)
  • На обратной стороне вышеупомянутого некоторый сценарий (или часть такого) может зависеть от структуры каталогов, созданной ранее (возможно другим пакетом/сценарием). Например, сценарий установки пакета, возможно, должен был бы поместить библиотеки в subdir /usr/local/lib/GreatSoftware/ImportantPartOfIt, но библиотеки зависят от / связываются для наполнения под /usr/local/lib/GreatSoftware. Если это отсутствует, сценарий не должен продолжаться.

Универсальное поведение mkdir помогает и о естественных, ситуациях как таковых сообщают и можно немедленно поймать.


Можно сделать псевдоним для него, если Вы хотите всегда использовать mkdir -p в Ваших оболочках:

alias mkdir='mkdir -p'

(Это должно перейти к Вашему .bashrc или безотносительно конфигурации Ваше использование оболочки.)

6
27.01.2020, 19:57
  • 1
    я не предложил бы исказить стандартную команду для создания его ведущий себя нестандартный путь. Это сделало бы сценарии не портативными и могло бы смутить читателей. Создание нового псевдонима или функции, как alias mkdp="mkdir -p" было бы более желательным. –  jlliagre 31.10.2011, 14:56
  • 2
    @jlliagre нет, это не влияло бы на сценарии. Псевдонимы, определенные локально в .bashrc (обычно) не влияйте на их среды. –  rozcietrzewiacz 31.10.2011, 15:30
  • 3
    Действительно, но Вы упустили мою суть. Искажение стандартной команды для изменения ее поведения, даже для собственного использования, не является методическими рекомендациями. Причем худшим примером является повсеместное alias rm='rm -i'. –  jlliagre 31.10.2011, 16:10
  • 4
    @jlliagre, Не рекомендуемый, кого?;) Но да, я соглашаюсь, я самостоятельно использовал бы другой псевдоним - но для практического, не идеологических причин. Я также не думаю rm -i псевдоним всегда плох - хотя мог бы привести к дурным привычкам. Конечно, не все псевдонимы команды одинаково хороши/плохи - рассматривают ls="ls --color=auto" или ssh="TERM=xterm ssh" например. –  rozcietrzewiacz 31.10.2011, 16:16
  • 5
    В моей рекомендации нет ничего идеологического. Псевдоним комнаты косвенно ответственен за многие потерянные файлы (я встретил много жертв этого псевдонима). Я подозревал, что mkdir один имел, до большой меньшей степени, нежелательных побочных эффектов. Конечно, я не против косметики, не поведенческой, изменения как Ваш ssh и ls примеры. –  jlliagre 31.10.2011, 23:35

Конечно, можно было утверждать, что создание родительского каталога должно быть значением по умолчанию, и некоторая опция проверки могла использоваться для предотвращения создания каталога, если родитель не существует.

Но причиной, почему это наоборот, является просто история. Базовая версия mkdir не создала родительские каталоги. Поэтому дистрибутивы X11 пришли с командой, названной mkdirhier, который смог выполнить эту задачу: проверьте, существуют ли родительские каталоги и создают их, если необходимо.

Позже эта функциональность была добавлена к команде mkdir на многих версиях UNIX (я не знаю, находится ли это в стандарте POSIX в наше время). Для поддержания совместимости, эта функция была сделана доступной путем включения флага опции: -p.

Почему это плохо, чтобы включить его по умолчанию? Сценарии могут полагаться на сбой mkdir, если родительский каталог не существует. Тем более, что пользователь базируется, могло быть опасно создать деревья каталогов по умолчанию.

Пример:

 if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
  then
    perform_backup ...

В этом примере был бы создан каталог, и резервное копирование, выполненное даже, является файловой системой /backup не смонтирован и родитель /backup/$(uname -n) не существует, если значение по умолчанию было бы наоборот.

Эмпирическое правило: Это - хорошая практика для не изменения поведения по умолчанию любого инструмента. При желании предоставьте возможности позволять изменять поведение по умолчанию.

16
27.01.2020, 19:57
  • 1
    мне нравится пример монтирования, который Вы использовали здесь. Я не думал о том конкретном сценарии. –  Treffynnon 31.10.2011, 14:08
  • 2
    p (и-m) опции были представлены System V в 1983. Оба - определенно часть стандарта POSIX. –  jlliagre 31.10.2011, 15:05

Я думаю, это - вид философии. Пустой mkdir (1) команда (без опций) представляет mkdir (2) системный вызов, обеспечивая его функциональность в оболочке, ничего не делая более или менее.

4
27.01.2020, 19:57

В начале, там было только пусто mkdir команда. В соответствии с принципами разработки Unix, эта простая команда выполнила одну простую задачу: создание каталога.

Позже, mkdir полученный a -p опция обработать случай общего использования, где вызывающая сторона хочет создать нуль, один или несколько каталогов, чтобы гарантировать, что существует конкретный путь. Это не было сделано операцией по умолчанию по нескольким причинам. Во-первых, не все системы имели эту более сложную функцию и требование -p опция означала, что сценарии, которые использовали ее, получат разумное сообщение об ошибке (что-то как mkdir: invalid option -z) вместо того, чтобы странно не удаваться создать каталоги иногда. Во-вторых, и самое главное, поведение mkdir -p не совместимая замена mkdir во всех случаях.

В частности, на большей части fileystems, mkdir атомарная операция. Если прогоны программы mkdir playground и команда успешно выполняется, программа знает, что создала playground каталог. Это позволяет программе рассматривать новый каталог как свою эксклюзивную детскую площадку: если другой экземпляр той же программы работает одновременно, ее вызов к mkdir playground перестанет работать. Этим свойством, очевидно, не обеспечивают mkdir -p так как это позволяет аргументу существовать.

Если mkdir -p существовал от запуска, это, возможно, было сделано режимом по умолчанию с чем-то как mkdir -a для команды создания с одним каталогом. Но это не следовало бы за обычными принципами проектирования Unix: большинство основных утилит является простыми обертками вокруг базовых примитивов с более необычным поведением (как создание нескольких каталогов сразу) требующий необычных опций.

4
27.01.2020, 19:57

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

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

2
27.01.2020, 19:57

Теги

Похожие вопросы