No veo ninguna razón por la cual el -p
indicador mkdir
no debería establecerse de forma predeterminada.
-p, --parents no error if existing, make parent directories as needed
Es un comando no destructivo por lo que puedo ver. ¿Me he perdido algo importante sobre cómo funciona esto?
En segundo lugar, ¿hay una manera fácil de hacer que este sea el comportamiento predeterminado de mkdir
?
command-line
Treffynnon
fuente
fuente
alias mkdir="mkdir -p"
.mkdp
Respuestas:
Esta es una característica opcional, que no siempre se desea, especialmente en los scripts. Considere los siguientes inconvenientes en caso de scripts:
/usr/local/lib/GreatSoftware/ImportantPartOfIt
, pero las bibliotecas dependen de / link to stuff under/usr/local/lib/GreatSoftware
. Si esto falta, la secuencia de comandos no debe continuar.El comportamiento genérico de lo
mkdir
hace fácil y natural, ya que tales situaciones se informan y pueden detectarse de inmediato.Puedes crear un alias si quieres usarlo siempre
mkdir -p
en tus shells:(Esto debería ir a su
.bashrc
configuración o la configuración que utilice su shell).fuente
alias mkdp="mkdir -p"
sería más aconsejable..bashrc
no (normalmente) afectan sus entornos.alias rm='rm -i'
.rm -i
alias sea siempre malo, aunque podría conducir a malos hábitos. Ciertamente, no todos los alias de comando son igualmente buenos / malos, considérelols="ls --color=auto"
o,ssh="TERM=xterm ssh"
por ejemplo.Por supuesto, uno podría argumentar que la creación del directorio principal debería ser la predeterminada y alguna opción de verificación podría usarse para evitar la creación del directorio si el principal no existe.
Pero la razón por la cual es al revés es solo historia. La versión básica de mkdir no creó directorios principales. Esta es la razón por la cual las distribuciones X11 llegaron junto con un comando llamado mkdirhier que pudo cumplir esta tarea: verifique si existen los directorios principales y créelos si es necesario.
Más tarde, esta funcionalidad se agregó al comando mkdir en muchas versiones de UNIX (no sé si actualmente está en el estándar POSIX). Para mantener la compatibilidad con esta característica se puso a disposición mediante la activación de una bandera opción:
-p
.¿Por qué es malo tenerlo activado de forma predeterminada? Los scripts pueden confiar en que mkdir falla si el directorio padre no existe. Especialmente como usuario root , podría ser peligroso crear árboles de directorios por defecto.
Ejemplo:
En este ejemplo, el directorio se crearía y la copia de seguridad se realizaría incluso si el sistema de archivos
/backup
no está montado y el padre/backup/$(uname -n)
no existe si el valor predeterminado sería al revés.Regla de oro: es una buena práctica no cambiar el comportamiento predeterminado de ninguna herramienta. Si lo desea, proporcione opciones para permitir cambiar el comportamiento predeterminado.
fuente
Creo que esta es una filosofía. El comando bare mkdir (1) (sin opciones) representa la llamada al sistema mkdir (2) , proporcionando su funcionalidad en shell, sin hacer nada más o menos.
fuente
Al principio , solo existía el
mkdir
comando desnudo . De acuerdo con los principios de diseño de Unix, este comando simple realizó una tarea simple: crear un directorio.Más tarde,
mkdir
adquirió una-p
opción para manejar un caso de uso común en el que la persona que llama desea crear cero, uno o más directorios para garantizar que exista una ruta en particular. Esto no se convirtió en la operación predeterminada por varias razones. Primero, no todos los sistemas tenían esta característica más compleja, y requerir la-p
opción significaba que los scripts que la usaban obtendrían un mensaje de error razonable (algo asímkdir: invalid option -z
) en lugar de fallar extrañamente en la creación de directorios ocasionalmente. En segundo lugar, y lo más importante, el comportamiento demkdir -p
no es un reemplazo compatiblemkdir
en todos los casos.En particular, en la mayoría de los sistemas de archivos,
mkdir
es una operación atómica . Si se ejecuta un programamkdir playground
y el comando tiene éxito, el programa sabe que creó elplayground
directorio. Esto permite que el programa trate el nuevo directorio como su área de juegos exclusiva: si otra instancia del mismo programa se ejecuta simultáneamente, su llamada amkdir playground
fallará. Obviamente, esta propiedad no se proporcionamkdir -p
ya que permite que exista el argumento.Si
mkdir -p
hubiera existido desde el principio, podría haberse convertido en el modo predeterminado, con algo así comomkdir -a
para el comando de creación de un solo directorio. Pero eso no habría seguido la filosofía habitual de diseño de Unix: la mayoría de las utilidades básicas son envoltorios simples alrededor de las primitivas subyacentes, con un comportamiento más sofisticado (como crear múltiples directorios de una vez) que requieren opciones sofisticadas.fuente
Para mí, el problema es que el comportamiento de la opción -p si fuera el predeterminado es esencialmente un efecto secundario. Agrega complejidad a un comando al hacer algo adicional a lo que le pidió que hiciera. Es una cosa invisible más para tener que recordar. Una de las reglas básicas de la práctica de programación de sonido es evitar los efectos secundarios.
Los lenguajes de programación modernos son tan potentes que es relativamente fácil construir cualquier comando complejo que pueda necesitar a partir de las primitivas que proporciona un lenguaje. Hacerlo implica tomar una decisión consciente sobre qué comportamiento se requiere y también deja un registro concreto y visible de lo que se ha hecho.
fuente