. и источник несколько отличается в zsh, по крайней мере (это - то, что я использую), потому что
source file
Работы, в то время как
. file
не делает, этому нужно
. ./file
Это - дополнительная функция, которая не всегда желаема - особенно в сценариях. Рассмотрите следующие недостатки в случае сценариев:
/usr/local/lib/GreatSoftware/ImportantPartOfIt
, но библиотеки зависят от / связываются для наполнения под /usr/local/lib/GreatSoftware
. Если это отсутствует, сценарий не должен продолжаться.Универсальное поведение mkdir
помогает и о естественных, ситуациях как таковых сообщают и можно немедленно поймать.
Можно сделать псевдоним для него, если Вы хотите всегда использовать mkdir -p
в Ваших оболочках:
alias mkdir='mkdir -p'
(Это должно перейти к Вашему .bashrc
или безотносительно конфигурации Ваше использование оболочки.)
Конечно, можно было утверждать, что создание родительского каталога должно быть значением по умолчанию, и некоторая опция проверки могла использоваться для предотвращения создания каталога, если родитель не существует.
Но причиной, почему это наоборот, является просто история. Базовая версия mkdir не создала родительские каталоги. Поэтому дистрибутивы X11 пришли с командой, названной mkdirhier, который смог выполнить эту задачу: проверьте, существуют ли родительские каталоги и создают их, если необходимо.
Позже эта функциональность была добавлена к команде mkdir на многих версиях UNIX (я не знаю, находится ли это в стандарте POSIX в наше время). Для поддержания совместимости, эта функция была сделана доступной путем включения флага опции: -p
.
Почему это плохо, чтобы включить его по умолчанию? Сценарии могут полагаться на сбой mkdir, если родительский каталог не существует. Тем более, что пользователь базируется, могло быть опасно создать деревья каталогов по умолчанию.
Пример:
if mkdir /backup/$(uname -n)/$(date +%Y%m%d)
then
perform_backup ...
В этом примере был бы создан каталог, и резервное копирование, выполненное даже, является файловой системой /backup
не смонтирован и родитель /backup/$(uname -n)
не существует, если значение по умолчанию было бы наоборот.
Эмпирическое правило: Это - хорошая практика для не изменения поведения по умолчанию любого инструмента. При желании предоставьте возможности позволять изменять поведение по умолчанию.
Я думаю, это - вид философии. Пустой mkdir (1) команда (без опций) представляет mkdir (2) системный вызов, обеспечивая его функциональность в оболочке, ничего не делая более или менее.
В начале, там было только пусто 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: большинство основных утилит является простыми обертками вокруг базовых примитивов с более необычным поведением (как создание нескольких каталогов сразу) требующий необычных опций.
Мне проблема - то, что поведение-p опции, если это было значение по умолчанию, является по существу побочным эффектом. Это добавляет сложность к команде путем выполнения чего-то дополнительного к тому, что Вы попросили, чтобы это сделало. Это - еще одна невидимая вещь должным быть помнить. Одно из основных правил звуковой практики программирования состоит в том, чтобы избежать побочных эффектов.
Современные языки программирования так мощны, что относительно легко создать безотносительно сложной команды Вам, возможно, понадобится от примитивов, которые обеспечивает язык. Выполнение так включает принятие сознательного решения относительно того, какое поведение требуется и также оставляет конкретной, видимой записью того, что было сделано.
alias mkdp="mkdir -p"
было бы более желательным. – jlliagre 31.10.2011, 14:56.bashrc
(обычно) не влияйте на их среды. – rozcietrzewiacz 31.10.2011, 15:30alias rm='rm -i'
. – jlliagre 31.10.2011, 16:10rm -i
псевдоним всегда плох - хотя мог бы привести к дурным привычкам. Конечно, не все псевдонимы команды одинаково хороши/плохи - рассматриваютls="ls --color=auto"
илиssh="TERM=xterm ssh"
например. – rozcietrzewiacz 31.10.2011, 16:16