.*
Bash expande la expresión para incluir los directorios actual y principal:
$ ls -la
total 2600
drwxrwxrwx 2 terdon terdon 2162688 Sep 10 16:22 .
drwxr-xr-x 142 terdon terdon 491520 Sep 10 15:34 ..
-rw-r--r-- 1 terdon terdon 0 Sep 10 16:22 foo
$ echo .*
. ..
Si ejecuto rm -rf .*
mi Debian usando GNU bash, version 4.2.36(1)-release
y rm
de rm (GNU coreutils) 8.13
, recibo este mensaje:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
¿Es esto una cosa de GNU o es POSIX? ¿Hay algún sistema * nix donde el comando anterior se eliminará silenciosamente .
y ..
?
Además, ¿es esta una característica de seguridad del shell o del rm
comando en sí?
rm
, pero pensé que valía la pena mencionar que aún puede tener resultados inesperados conchmod
,chown
, etc. cuando juego.*
.Respuestas:
La última versión (a partir de 2017) de la especificación POSIX para la
rm
utilidad está aquí (y la anterior allí ) y prohíbe la eliminación de.
y..
.Como señaló @jlliagre, la parte sobre
/
es una adición en SUSv4.La especificación de Unix más antigua disponible públicamente que pude encontrar ( XPF4 CAE rev2 (1994)), ya especificó eso
.
y..
no se puede eliminar, aunque los comentarios en el registro de cambios de archivos de GNU sugieren que ya era el caso en las especificaciones POSIX más antiguas.Tenga en cuenta que se aplica a
dir/..
y../
, así, pero algunas implementaciones (incluyendo certificados por los UNIX como Solaris 11 y MacOS) todavía no salvaguarda contrarm -rf ../
orm -rf .*/
).historia
Unices tempranos
La
-r
opción derm
se agregó en Unix V3 (1973) aunque solo estaba eliminando el contenido de los directorios, aún necesitaría usarrmdir
para eliminar directorios.Eso cambió en Unix V7 (1979, el lanzamiento que también introdujo el shell Bourne y del que deriva la mayoría de los Unices).
rm -r
ahora también eliminó directorios y no eliminaría el..
árbol de directorios. La página del manual dice:(aunque se podría argumentar que
rm -r .*
todavía es antisocial ya que elimina todo porque.
está incluido).Todavía aceptó eliminar
.
aunque no desvincularía las entradas.
o..
. Entonces,rm -r .
fue una forma efectiva de vaciar el directorio actual.También tenga en cuenta que la protección fue solo para un
..
argumento literal , no paradir/..
o./..
. Entonces,rm -rf ./.*
aún eliminaría todo en el directorio padre de forma recursiva.Es interesante ver que eso ya era para solucionar el error / mal funcionamiento por el cual los globos podrían incluir
.
y..
en su expansión. Eso se arregló en el shell Forsyth (la base del shell Minix original y pdksh) a finales de los años 80,zsh
(1990) yfish
(2005) pero no en otros shells y, en particular, no en elsh
lenguaje POSIX que requiere la expansión de.*
incluir.
y..
si son devueltos porreaddir()
(bash
aborda el problema en parte solo conshopt -s dotglob
dónde los globos (excepto.xxx
los) no incluyen.
o..
, y conksh
, puede solucionarlo haciendoFIGNORE='@(.|..)'
).Cuando
.
también se agregó exactamente la prohibición no siempre es claro y varía con cada Unix. Algunos hallazgos a continuación.BSD
La prohibición de
.
se agregó en algún momento entre 2.9BSD (1983) y 2.10BSD (1987) y entre 4.2BSD (1983) y 4.3BSD (1986) (ver este cambio marcado en 1985 en el repositorio de historia de Unix ).Para
dir/.
ydir/..
, vea este cambio en 1988 (BSD 4.3 Neto / 1).Hasta la fecha, la
rm
versión de FreeBSD (y derivados como macOS) todavía vacía el directorio actual o principal enrm -rf ./
orm -rf ../
aunque (es importanterm -rf .*/
).Sistema V
No tengo mucha información ya que ni la fuente ni el binario están disponibles públicamente para los derivados de AT&T Unix después de V7. En su manual en línea, HPUX (basado en el Sistema III) todavía menciona que solo prohíbe
..
mientras efectivamente prohíbe ambos, lo cual es una indicación de que probablemente al menos SysIII no prohibió la eliminación de.
( editar : ahora mirando elrm
código fuente SysIII , es prácticamente sin cambios desde Unix V7).Todos los demás manuales en línea que he revisado mencionan la eliminación
.
o..
está prohibido, lo que se espera que sea compatible con POSIX.Solaris
rm
todavía vacía el directorio actual o principal enrm -rf ./
orm -rf ../
.ÑU
El registro de cambios temprano para los archivos GNU contiene toda la información histórica.
Si bien originalmente no se eliminó
.
ni..
se prohibió,..
se prohibió primero y luego ambos (incluidodir/.
), todo entre 1990 y 1991.otro
Como vimos, en
zsh
, la expansión de.*
(o cualquier globo) nunca incluye.
o..
(incluso ensh
modo de emulación). Elrm
incorporado (que obtienes si lo haceszmodload zsh/files
), por lo tanto, no se trata.
o..
especialmente. Entonces, con esezsh
incorporado, puederm -rf .
orm -rf ..
vaciar.
o..
, perorm -rf .*
no eliminará.
o..
.En busybox
rm
, la prohibición de eliminación de.
y..
se agregó en 0.52 (2001)fuente
rm -rf . /
(tenga en cuenta el espacio) debe imprimir dos advertencias (para.
y/
) y salir, pero parece que recibimos una pregunta sobre cómo recuperarse de eso cada dos meses.