Não vejo razão para que o -p
sinalizador mkdir
ativado não seja definido por padrão.
-p, --parents no error if existing, make parent directories as needed
É um comando não destrutivo do que posso ver. Perdi algo importante sobre o modo como isso funciona?
Em segundo lugar, existe uma maneira fácil de conseguir que esse seja o comportamento padrão de mkdir
?
command-line
Treffynnon
fonte
fonte
alias mkdir="mkdir -p"
.mkdp
Respostas:
Esse é um recurso opcional, que nem sempre é desejado - especialmente em scripts. Considere as seguintes desvantagens no caso de scripts:
/usr/local/lib/GreatSoftware/ImportantPartOfIt
, mas as bibliotecas dependem do / link para o material abaixo/usr/local/lib/GreatSoftware
. Se isso estiver faltando, o script não deve continuar.O comportamento genérico de
mkdir
torna mais fácil e natural, pois essas situações são relatadas e podem ser detectadas imediatamente.Você pode criar um alias para isso, se quiser sempre usar
mkdir -p
em seus shells:(Isso deve ir para o seu
.bashrc
ou qualquer configuração que seu shell use.)fonte
alias mkdp="mkdir -p"
seria mais aconselhável..bashrc
(normalmente) não afetam seus ambientes.alias rm='rm -i'
.rm -i
alias seja sempre ruim - embora possa levar a maus hábitos. Certamente nem todos os apelidos de comando são igualmente bons / ruins - considerels="ls --color=auto"
oussh="TERM=xterm ssh"
por exemplo.Obviamente, pode-se argumentar que a criação do diretório pai deve ser o padrão e alguma opção de verificação pode ser usada para impedir a criação do diretório se o pai não existir.
Mas a razão pela qual é o contrário é apenas história. A versão básica do mkdir não criou diretórios pai. É por isso que as distribuições X11 vieram com um comando chamado mkdirhier, capaz de executar esta tarefa: verifique se os diretórios pai existem e crie-os, se necessário.
Posteriormente, essa funcionalidade foi adicionada ao comando mkdir em muitas versões do UNIX (não sei se ele está atualmente no padrão POSIX). Para manter a compatibilidade esse recurso foi disponibilizado, rodando em uma bandeira opção:
-p
.Por que é ruim ativá-lo por padrão? Os scripts podem confiar na falha do mkdir se o diretório pai não existir. Especialmente como usuário root , pode ser perigoso criar árvores de diretório por padrão.
Exemplo:
Neste exemplo, o diretório seria criado e o backup executado mesmo se o sistema de arquivos
/backup
não estiver montado e o pai/backup/$(uname -n)
não existir se o padrão for o contrário.Regra geral: é uma boa prática não alterar o comportamento padrão de nenhuma ferramenta. Se desejado, forneça opções para permitir a alteração do comportamento padrão.
fonte
Eu acho que isso é meio que filosofia. O comando bare mkdir (1) (sem opções) representa a chamada do sistema mkdir (2) , fornecendo sua funcionalidade no shell, sem fazer nada mais ou menos.
fonte
No começo , havia apenas o
mkdir
comando nu . De acordo com os princípios de design do Unix, este comando simples executou uma tarefa simples: criar um diretório.Posteriormente,
mkdir
adquiriu uma-p
opção para lidar com um caso de uso comum em que o chamador deseja criar zero, um ou mais diretórios para garantir a existência de um caminho específico. Isso não foi tornado a operação padrão por vários motivos. Primeiro, nem todos os sistemas tinham esse recurso mais complexo, e exigir a-p
opção significava que os scripts que o usassem receberiam uma mensagem de erro razoável (algo comomkdir: invalid option -z
) ao invés de estranhamente falhar ao criar diretórios ocasionalmente. Segundo, e mais importante, o comportamento demkdir -p
não é uma substituição compatívelmkdir
em todos os casos.Em particular, na maioria dos sistemas de arquivos,
mkdir
é uma operação atômica . Se um programa for executadomkdir playground
e o comando for bem-sucedido, o programa sabe que criou oplayground
diretório. Isso permite que o programa trate o novo diretório como seu playground exclusivo: se outra instância do mesmo programa estiver sendo executada simultaneamente, sua chamada paramkdir playground
falhará. Obviamente, essa propriedade não é fornecida,mkdir -p
pois permite que o argumento exista.Se
mkdir -p
existisse desde o início, poderia ter sido feito no modo padrão, com algo parecidomkdir -a
com o comando de criação de diretório único. Mas isso não teria seguido a filosofia usual de design do Unix: os utilitários mais básicos são wrappers simples em torno das primitivas subjacentes, com um comportamento mais sofisticado (como criar vários diretórios de uma só vez) exigindo opções sofisticadas.fonte
Para mim, o problema é que o comportamento da opção -p, se fosse o padrão, é essencialmente um efeito colateral. Ele adiciona complexidade a um comando, fazendo algo adicional ao que você pediu. É mais uma coisa invisível a ser lembrada. Uma das regras básicas da boa prática de programação é evitar efeitos colaterais.
As linguagens de programação modernas são tão poderosas que é relativamente fácil criar qualquer comando complexo que você possa precisar a partir das primitivas que uma linguagem fornece. Fazer isso envolve tomar uma decisão consciente sobre qual comportamento é necessário e também deixa um registro concreto e visível do que foi feito.
fonte