rmdirelimina directorios, rmelimina. ¿Por qué sería intuitivo rmdireliminar no directorios?
Stéphane Chazelas
55
Porque no lo es. Tienes 40 años de retraso haciendo esta pregunta, y le preguntas a las personas equivocadas.
user207421
Respuestas:
25
Al principio del Sistema de archivos Unix (al menos en los días V7, alrededor de 1970), los directorios se implementaron como archivos especiales y solo root podía usar la mknod(2)llamada al sistema que los creó y solo root podía unlink(2)un archivo especial de directorio.
Estas protecciones estaban en su lugar para mantener la estructura del sistema de archivos consistente. Por ejemplo, si a un usuario se le permitiera escribir en un archivo especial de directorio, podría hacer que su directorio padre se ..señalara a sí mismo (específicamente su propio nodo i). Esto crearía una referencia circular en el sistema de archivos que sería una mala cosa. Por supuesto, hay otras inconsistencias que uno podría hacer, este es solo un ejemplo claro.
La coherencia se mantuvo mediante programas de espacio de usuario como mkdir(1)y rmdir(1)que eran raíz Set-UID para que pudieran hacer las llamadas privilegiadas del sistema en nombre de un usuario no privilegiado. Cuando se agregaba la recursividad rm(1), el comando remove se ejecutaría como el UID actual y luego se llamaría rmdir(1)únicamente para eliminar directorios vacíos. Este sigue siendo un método bastante estándar de elevación de permisos: no use más permisos de los que necesita.
Algún tiempo después mkdir(2)y rmdir(2)se agregaron como sus propias llamadas al sistema, pero la relación entre rm(1)y rmdir(1)permanece.
Personalmente, me parece un poco más satisfactorio rmdir junky sé que lo peor que hice fue eliminar un directorio vacío.
Re la última oración: Presumiblemente, si la operación de eliminación recursiva estuviera activa rmdir, todavía necesitaría una -rbandera. (en rmdir -r junklugar de rm -r junk, y rmdir junktodavía funciona si el directorio está vacío)
user253751
7
Es historico. rmse realizó para eliminar las referencias a los archivos, rmdirse realizó para eliminar directorios, en paralelo a mkdir. Hace muchos años, Unix rmsolo podía eliminar directorios invocando rmdir. Tampoco hubo una rmdir(2)llamada al sistema, rmdirfue un programa que llamó unlink(2).
Es pura cuestión de opinión, pero rmelimina archivos mientras rmdirelimina directorios. Un directorio es un archivo, pero un tipo especial de archivo, por lo que tiene sentido rmeliminarlos, pero tratarlos especialmente (es decir, requerir una opción adicional para habilitar la capacidad). Por otro lado, no todos los archivos son directorios, y no tiene sentido en mi humilde opinión para rmdireliminar algo que no es un directorio.
rmdir
elimina directorios,rm
elimina. ¿Por qué sería intuitivormdir
eliminar no directorios?Respuestas:
Al principio del Sistema de archivos Unix (al menos en los días V7, alrededor de 1970), los directorios se implementaron como archivos especiales y solo root podía usar la
mknod(2)
llamada al sistema que los creó y solo root podíaunlink(2)
un archivo especial de directorio.Estas protecciones estaban en su lugar para mantener la estructura del sistema de archivos consistente. Por ejemplo, si a un usuario se le permitiera escribir en un archivo especial de directorio, podría hacer que su directorio padre se
..
señalara a sí mismo (específicamente su propio nodo i). Esto crearía una referencia circular en el sistema de archivos que sería una mala cosa. Por supuesto, hay otras inconsistencias que uno podría hacer, este es solo un ejemplo claro.La coherencia se mantuvo mediante programas de espacio de usuario como
mkdir(1)
yrmdir(1)
que eran raíz Set-UID para que pudieran hacer las llamadas privilegiadas del sistema en nombre de un usuario no privilegiado. Cuando se agregaba la recursividadrm(1)
, el comando remove se ejecutaría como el UID actual y luego se llamaríarmdir(1)
únicamente para eliminar directorios vacíos. Este sigue siendo un método bastante estándar de elevación de permisos: no use más permisos de los que necesita.Algún tiempo después
mkdir(2)
yrmdir(2)
se agregaron como sus propias llamadas al sistema, pero la relación entrerm(1)
yrmdir(1)
permanece.Personalmente, me parece un poco más satisfactorio
rmdir junk
y sé que lo peor que hice fue eliminar un directorio vacío.fuente
rmdir
, todavía necesitaría una-r
bandera. (enrmdir -r junk
lugar derm -r junk
, yrmdir junk
todavía funciona si el directorio está vacío)Es historico.
rm
se realizó para eliminar las referencias a los archivos,rmdir
se realizó para eliminar directorios, en paralelo amkdir
. Hace muchos años, Unixrm
solo podía eliminar directorios invocandormdir
. Tampoco hubo unarmdir(2)
llamada al sistema,rmdir
fue un programa que llamóunlink(2)
.Referencias
fuente
Es pura cuestión de opinión, pero
rm
elimina archivos mientrasrmdir
elimina directorios. Un directorio es un archivo, pero un tipo especial de archivo, por lo que tiene sentidorm
eliminarlos, pero tratarlos especialmente (es decir, requerir una opción adicional para habilitar la capacidad). Por otro lado, no todos los archivos son directorios, y no tiene sentido en mi humilde opinión pararmdir
eliminar algo que no es un directorio.fuente
rm
eliminar un directorio vacío (excepto en modo recursivo)?-r
marca para habilitar la función de archivo especial de directorio.