Я не вижу причин, по которым -p
флаг mkdir
не должен быть установлен по умолчанию.
-p, --parents no error if existing, make parent directories as needed
Из того, что я вижу, это неразрушающая команда. Я пропустил что-то важное о том, как это работает?
Во-вторых, есть ли простой способ установить поведение по умолчанию mkdir
?
command-line
Treffynnon
источник
источник
alias mkdir="mkdir -p"
.mkdp
Ответы:
Это необязательная функция, которая не всегда желательна, особенно в сценариях. Рассмотрим следующие недостатки в случае сценариев:
/usr/local/lib/GreatSoftware/ImportantPartOfIt
, но библиотеки зависят от / link, находящейся в каталоге/usr/local/lib/GreatSoftware
. Если это отсутствует, сценарий не должен продолжаться.Общее поведение
mkdir
делает его простым и естественным, так как о таких ситуациях сообщают, и их можно поймать сразу.Вы можете сделать для него псевдоним, если хотите всегда использовать
mkdir -p
в своих оболочках:(Это должно быть в вашей
.bashrc
или любой другой конфигурации вашей оболочки.)источник
alias mkdp="mkdir -p"
было бы более целесообразно..bashrc
(обычно), не влияют на их среду.alias rm='rm -i'
.rm -i
псевдоним всегда плох, хотя может привести к вредным привычкам. Конечно, не все псевдонимы команд одинаково хороши / плохи - рассмотримls="ls --color=auto"
илиssh="TERM=xterm ssh"
например.Конечно, можно утверждать, что создание родительского каталога должно быть по умолчанию, и можно использовать некоторую опцию проверки, чтобы предотвратить создание каталога, если родительский объект не существует.
Но причина, по которой все наоборот, - просто история. Базовая версия mkdir не создавала родительские каталоги. Вот почему в дистрибутивах X11 появилась команда с именем mkdirhier, которая смогла выполнить эту задачу: проверить, существуют ли родительские каталоги, и при необходимости создать их.
Позже эта функциональность была добавлена к команде mkdir во многих версиях UNIX (я не знаю, входит ли она в стандарт POSIX в настоящее время). Для поддержания совместимости эта функция была доступна при включении флага опции:
-p
.Почему плохо включить его по умолчанию? Сценарии могут полагаться на сбой mkdir, если родительский каталог не существует. Тем более, что пользователь root может по умолчанию создавать деревья каталогов.
Пример:
В этом примере каталог будет создан, и резервное копирование будет выполнено даже в том случае, если файловая система
/backup
не смонтирована, а родительский/backup/$(uname -n)
объект не существует, если по умолчанию будет наоборот.Практическое правило. Рекомендуется не изменять поведение по умолчанию для любого инструмента. При желании укажите параметры, позволяющие изменить поведение по умолчанию.
источник
Я думаю, это своего рода философия. Голая команда mkdir (1) (без опций) представляет системный вызов mkdir (2) , обеспечивающий его функциональность в оболочке и не делающий ничего более или менее.
источник
В начале была только голая
mkdir
команда. В соответствии с принципами проектирования Unix, эта простая команда выполняла одну простую задачу: создание каталога.Позже,
mkdir
приобрел-p
опцию для обработки общего случая использования, когда вызывающая сторона хочет создать ноль, один или несколько каталогов, чтобы гарантировать, что конкретный путь существует. Это не было сделано операцией по умолчанию по нескольким причинам. Во-первых, не во всех системах была эта более сложная функция, и-p
наличие опции означало, что сценарии, которые ее использовали, получали бы разумное сообщение об ошибке (что-то вроде этогоmkdir: invalid option -z
), а не странно не могли иногда создавать каталоги. Во-вторых, и самое главное, поведениеmkdir -p
не является совместимой заменойmkdir
во всех случаях.В частности, на большинстве файловых систем
mkdir
это атомарная операция . Если программа выполняетсяmkdir playground
и команда выполнена успешно, она знает, что создалаplayground
каталог. Это позволяет программе рассматривать новый каталог как свою исключительную игровую площадку: если другой экземпляр той же программы работает одновременно, ее вызовmkdir playground
завершится неудачно. Это свойство явно не предоставляется,mkdir -p
так как оно позволяет аргументу существовать.Если бы
mkdir -p
он существовал с самого начала, его можно было бы сделать режимом по умолчанию, например,mkdir -a
для команды создания одного каталога. Но это не следовало бы обычной философии проектирования Unix: большинство базовых утилит представляют собой простые обертки вокруг базовых примитивов, причём более причудливое поведение (например, создание нескольких каталогов за один раз) требует необычных опций.источник
Для меня проблема в том, что поведение параметра -p, если оно было значением по умолчанию, по сути является побочным эффектом. Это добавляет сложности команде, делая что-то дополнительное к тому, что вы просили сделать. Это еще одна невидимая вещь, которую нужно помнить. Одно из основных правил практики здорового программирования - избегать побочных эффектов.
Современные языки программирования настолько мощны, что относительно легко собрать любую сложную команду, которая может вам понадобиться, из примитивов, которые предоставляет язык. Это включает в себя принятие сознательного решения о том, какое поведение требуется, а также оставляет конкретную, видимую запись того, что было сделано.
источник