Ви можете знайти версію HTML усіх видань POSIX 2008 в Інтернеті:
Це було додано у виданні 2008 року.
Технічні виправлення зазвичай не додають нових функцій.
Ви можете бачити, що в попередній версії ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) не було цього тексту.
Новий текст був прийнятий на конференції австрійської групи 2003-05-09 для включення до подальшої редакції стандарту.
На це звернувся Джон Бек із компанії Sun Microsystems у березні того ж року (посилання вимагає реєстрації для відкриття групи, див. Також Запит №5 на покращення тут ).
Джон Бек писав, у вівторок, 11 березня 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
додав --preserve-root
та --no-preserve-root
варіанти в цьому комітеті 2003-11-09 , але --preserve-root
став лише типовим у цьому комітеті 2006-09-03 , тому в coreutils 6.2
FreeBSD зберігає косу рису з цього 2004-10-04 комісії (з "Дізнайтеся, як справді є моє нижнє білизна" журналом фіксації), але спочатку не під часPOSIXLY_CORRECT
, поки вони не згадали перевірити через десятиліття, що POSIX зараз мандат на це, в який момент це було зроблено також у режимі POSIX .
У початковій програмі FreeBSD згадується, що Соляріс вже робив це в той час.
@JdePB (в коментарі нижче) виявив, що посилання на історію інсайдерської історії Sun не підтверджує та надає більше деталей про походження Solaris і припускає, що Solaris вже вступила в захист, перш ніж вони подали запит до групи Остіна.
Це пояснює обґрунтування додавання цього виключення. Хоча можна звинувачувати себе лише в тому випадку, якщо вони це роблять rm -rf /
, є випадок, коли сценарій міг би це зробити, якщо це робити, rm -rf -- "$1/$2"
не перевіряючи, що $1
/ $2
були надані. Це те, що погано вражає деяких клієнтів Sun при неправильному застосуванні патчу Solaris (за цим посиланням).
Заборона на видалення .
та ..
була додана задовго до цього і знову для захисту від можливих випадків. rm
все ще небезпечна команда. Він робить те, що призначено робити: видаліть те, що вам сказали.
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/*
Також видалить би все. Відомо, що завершення назви файлу оболонки викликає такі проблеми
rm -rf someth<Tab>/*
Розширено до:
rm -rf something /*
Бо something
так сталося, що це не каталог.
Оболонки люблять tcsh
або zsh
додадуть додаткову підказку при спробі зателефонувати rm
за допомогою *
символу "wildcard" ( tcsh
не за замовчуванням).