Vous pouvez trouver la version HTML de toutes les éditions de POSIX 2008 en ligne:
Cela a été ajouté dans l'édition 2008.
Les rectificatifs techniques n'ajoutent généralement pas de nouvelles fonctionnalités.
Vous pouvez voir que la version précédente ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) n'avait pas ce texte.
Le nouveau texte a été accepté lors de la conférence du groupe Austin 2003-05-09 pour inclusion dans une révision ultérieure de la norme.
Elle a été demandée par John Beck de Sun Microsystems en mars de la même année (le lien nécessite l'enregistrement d'un groupe ouvert, voir également Enhancement Request Number 5 ici ).
John Beck a écrit, le 11 mars 2003:
@ page 820 line 31681-31683 section rm comment {JTB-1}
Problem:
Defect code : 3. Clarification required
An occasional user mistake, with devastating consequences, is to
write a shell script with a line such as:
rm -rf $VARIABLE1/$VARIABLE2
or
rm -rf /$VARIABLE1
without verifying that either variable is set, which can lead to
rm -rf /
being the resulting command. Since there is no plausible
circumstance under which this is the desired behavior, it seems
reasonable to disallow this. Such a safeguard would, however,
violate the current specification.
Action:
Either extend the exceptions for . and .. on the noted lines
to list / as well, or specify that the behavior of rm if an
operand resolves to / is undefined.
GNU rm
ajouté --preserve-root
et --no-preserve-root
options dans cette validation 2003-11-09 , mais --preserve-root
n'est devenu la valeur par défaut dans cette validation 2006-09-03 , donc dans coreutils 6.2
FreeBSD a conservé la barre oblique depuis le commit du 10/10/2004 (avec un journal de commit "Découvrez à quel point mes sous-vêtements sont ignifugés" ), mais initialement pas quand il est sousPOSIXLY_CORRECT
, jusqu'à ce qu'ils se souviennent de vérifier une décennie plus tard que POSIX était maintenant le mandant à quel point il a été fait également en mode POSIX .
La validation initiale de FreeBSD mentionne que Solaris le faisait déjà à ce moment-là.
@JdePB (dans le commentaire ci-dessous) a trouvé ce lien vers une histoire d'initié de Sun corroborant et donnant plus de détails sur l'origine de Solaris et suggérant que Solaris avait déjà la sauvegarde en place avant de faire la demande au groupe Austin.
Il explique la justification de l'ajout de cette exclusion. Bien que l'on ne puisse se blâmer que s'ils le font rm -rf /
, il y a un cas où un script pourrait le faire s'il le fait rm -rf -- "$1/$2"
sans vérifier cela $1
/ qui a $2
été fourni, ce qui a mal frappé certains clients Sun lors d'une mauvaise application d'un correctif Solaris (selon ce lien).
L'interdiction de la suppression de .
et a ..
été ajoutée bien avant cela et à nouveau pour se prémunir contre les accidents potentiels. rm
est toujours une commande dangereuse. Il fait ce qu'il est censé faire: supprimer ce que vous lui dites.
rm -rf /*
cd /tmp && rm -rf .*/ # on some systems where rm -rf ../ still removes
# the content of ../ and shells that still
# may include . and .. in glob expansions.
rm -rf -- "$diretcory"/* # note the misspelled variable name
dir='foo '; rm -rf $dir/*
Serait également supprimer tout. La complétion du nom de fichier du shell est connue pour causer de tels problèmes lorsque vous le faites
rm -rf someth<Tab>/*
Développé à:
rm -rf something /*
Car something
il se trouve que ce n'était pas un répertoire.
Les shells comme tcsh
ou zsh
ajouteront une invite supplémentaire lorsque vous essayez d'appeler rm
avec un *
caractère générique ( tcsh
pas par défaut).