Wersję HTML wszystkich wydań POSIX 2008 można znaleźć online:
Zostało to dodane w edycji 2008.
Sprostowania techniczne na ogół nie dodają nowych funkcji.
Możesz zobaczyć, że poprzednia wersja ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) nie miała tego tekstu.
Nowy tekst został przyjęty na konferencji grupy austin 2003-05-09 do włączenia w późniejszej rewizji standardu.
Został o to poproszony przez Johna Becka z Sun Microsystems w marcu tego samego roku (link wymaga rejestracji w otwartej grupie, patrz także prośba o ulepszenie numer 5 tutaj ).
John Beck napisał w wtorek 11 marca 2003 r .:
@ 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
dodane --preserve-root
i --no-preserve-root
opcje w tym zatwierdzeniu 2003-11-09 , ale --preserve-root
stało się domyślnym tylko w tym zatwierdzeniu 2006-09-03 , więc w coreutils 6.2
FreeBSD zachowuje slash od czasu zatwierdzenia 2004-10-04 (z dziennikiem zatwierdzenia „Dowiedz się, jak ognioodporna jest moja bielizna” ), ale początkowo nie, kiedy był poniżejPOSIXLY_CORRECT
, dopóki nie przypomnieli sobie, aby sprawdzić dekadę później, że POSIX jest teraz nakazując, w którym momencie zostało to zrobione również w trybie POSIX .
Pierwsze zatwierdzenie FreeBSD wspomina, że Solaris już to robił.
@JdePB (w komentarzu poniżej) stwierdził, że link do poufnej informacji firmy Sun potwierdza i podaje więcej szczegółów na temat pochodzenia Solaris i sugeruje, że Solaris już miał zabezpieczenie, zanim zwrócił się do grupy Austin.
Wyjaśnia uzasadnienie dodania tego wyłączenia. Choć można winić tylko siebie, jeśli robią rm -rf /
, jest to przypadek, w którym skrypt może to zrobić, jeśli robi rm -rf -- "$1/$2"
bez sprawdzenia, które $1
/ $2
były dostarczane co jest rzeczą, która uderza trochę słońca klientom źle, kiedy niewłaściwe patch Solaris (zgodnie z tym linkiem).
Zakaz usuwania .
i ..
został dodany na długo przedtem, aby zabezpieczyć się przed potencjalnymi nieszczęściami. rm
wciąż jest niebezpiecznym poleceniem. Robi to, co powinien: usuwać to, co mu powiesz.
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/*
Usuwałby również wszystko. Wiadomo, że uzupełnianie nazw plików powłoki powoduje takie problemy
rm -rf someth<Tab>/*
Rozszerzony do:
rm -rf something /*
Ponieważ something
tak się nie stało, że jest katalogiem.
Powłoki takie jak tcsh
lub zsh
dodadzą dodatkowy monit przy próbie połączenia rm
za pomocą znaku *
wieloznacznego ( tcsh
domyślnie nie).