L'expression .*
est développée par bash pour inclure les répertoires courant et parent:
$ 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 je cours rm -rf .*
sur mon Debian GNU en utilisant bash, version 4.2.36(1)-release
et rm
de rm (GNU coreutils) 8.13
, je reçois ce message:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
Est-ce une chose GNU ou est-ce POSIX? Existe-t-il des systèmes * nix où la commande ci-dessus supprime silencieusement .
et ..
?
De plus, s'agit-il d'un élément de sécurité du shell ou de la rm
commande elle-même?
rm
, mais je pensais que ce mentionnais tout vaut que vous pouvez toujours avoir des résultats inattendus avecchmod
,chown
, etc lors de l' appariement.*
.Réponses:
La dernière version (à compter de 2017) de la spécification POSIX pour l'
rm
utilitaire est ici (et la précédente est là ) et interdit la suppression de.
and..
.Comme indiqué par @jlliagre, la partie concernant
/
est un ajout dans SUSv4.La plus ancienne spécification Unix accessible au public que j'ai pu trouver ( XPF4 CAE rev2 (1994)), spécifiait déjà cela
.
et..
ne pouvait pas être supprimée, bien que les commentaires dans le changelog de GNU fileutils suggèrent que c'était déjà le cas dans les anciennes spécifications POSIX.Notez qu'il applique
dir/..
et../
aussi, mais certaines implémentations (y compris ceux certifiés UNIX comme Solaris 11 et Mac OS) ne toujours pas garantie contrerm -rf ../
ourm -rf .*/
).histoire
Unices précoces
L'
-r
option to arm
été ajoutée dans Unix V3 (1973) bien qu'il ne s'agisse que de supprimer le contenu des répertoires, vous devrez toujours utiliserrmdir
pour supprimer des répertoires.Cela a changé dans Unix V7 (1979, la version qui a également introduit le shell Bourne et dont dérivent la plupart des Unices).
rm -r
les répertoires maintenant supprimés également et ne supprimeraient pas l’..
arborescence. La page de manuel dit:(Bien que l'on puisse dire que
rm -r .*
c'est toujours antisocial, car il supprime tout car il.
est inclus).Il acceptait toujours de supprimer
.
bien que cela ne dissocierait pas les entrées.
ou..
. Donc,rm -r .
était un moyen efficace de vider le répertoire en cours.Notez également que la sauvegarde était uniquement pour un
..
argument littéral , pas pourdir/..
ou./..
. Donc,rm -rf ./.*
toujours supprimer tout ce qui se trouve dans le répertoire parent de manière récursive.Il est intéressant de voir que c'était déjà pour contourner le bogue / le défaut d'utilisation par lequel les globs pourraient inclure
.
et..
dans leur développement. Cela a été corrigé dans le shell Forsyth (la base du shell original Minix et de pdksh) à la fin des années 80,zsh
(1990) etfish
(2005), mais pas dans d’autres shell et en particulier dans lesh
langage POSIX qui nécessite l’extension d’.*
inclure.
et..
si ils sont retournés parreaddir()
(nebash
résout le problème qu'en partie avec leshopt -s dotglob
cas où les globs (à l'exception de.xxx
ceux-ci) n'incluent pas.
ou..
, et avecksh
, vous pouvez le réparer en procédant de la sorteFIGNORE='@(.|..)'
).Quand exactement interdire
.
aussi était ajouté n'est pas toujours clair et varie avec chaque Unix. Quelques résultats ci-dessous.BSD
L'interdiction de a
.
été ajoutée entre 2.9BSD (1983) et 2.10BSD (1987) et entre 4.2BSD (1983) et 4.3BSD (1986) (voir ce changement horodaté en 1985 dans le rapport unix-history-repo ).Pour
dir/.
etdir/..
, voir ce changement en 1988 (BSD 4.3 Net / 1).À ce jour, le
rm
répertoire de FreeBSD (et de dérivés tels que macOS) vide toujours le répertoire actuel ou parent surrm -rf ./
ourm -rf ../
bien (compte pourrm -rf .*/
).Système V
Je n'ai pas beaucoup d'informations, car ni la source ni les fichiers binaires ne sont disponibles publiquement pour les dérivés Unix d'AT & T après la V7. Dans son manuel en ligne, HPUX (basé sur System III) mentionne toujours qu’il interdit uniquement,
..
bien qu’il interdise effectivement les deux, ce qui est une indication selon laquelle au moins SysIII n’a pas interdit la suppression de.
( edit : regardons maintenantrm
le code source SysIII , pratiquement inchangé depuis Unix V7).Tous les autres manuels en ligne que j'ai vérifiés mentionnent la suppression
.
ou l’..
interdiction qui est censée être conforme à POSIX.Solaris
rm
vide toujours le répertoire actuel ou parent surrm -rf ./
ourm -rf ../
.GNOU
Le premier changelog de GNU fileutils contient toutes les informations historiques.
Bien qu’à l’origine, ni supprimer,
.
ni..
interdire, il..
était interdit en premier, puis les deux (y comprisdir/.
), tous entre 1990 et 1991.autre
Comme nous l'avons vu,
zsh
l'expansion de.*
(ou de n'importe quel glob) n'inclut jamais.
ou..
(même ensh
mode d'émulation). Lerm
construit (que vous obtenez si vouszmodload zsh/files
) ne traite donc pas.
ou..
spécialement. Donc, avec cette fonctionzsh
intégrée, vous pouvezrm -rf .
ourm -rf ..
vider.
ou..
, maisrm -rf .*
ne retirerez pas.
ou..
.Dans busybox
rm
, l'interdiction de suppression de.
et a..
été ajoutée à 0.52 (2001)la source
rm -rf . /
(notez l’espace) doit imprimer deux avertissements (pour.
et/
) et se terminer, mais il semble que nous ayons une question nous demandant comment nous en sortir tous les deux mois.