Você pode encontrar a versão HTML de todas as edições do POSIX 2008 online:
Isso foi adicionado na edição de 2008.
As corrigendas técnicas geralmente não adicionam novos recursos.
Você pode ver a versão anterior ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) não tinha esse texto.
O novo texto foi aceito na conferência do grupo austin de 2003-05-09 para inclusão em uma revisão posterior do padrão.
Foi solicitado por John Beck, da Sun Microsystems, em março do mesmo ano (o link requer registro de grupo aberto, consulte também o Pedido de Aprimoramento Número 5 aqui ).
John Beck escreveu, em 11 de março de 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.
O GNU rm
adicionou --preserve-root
e --no-preserve-root
opções neste commit de 2003-11-09 , mas --preserve-root
só se tornou o padrão no commit de 03-09-2006 , portanto no coreutils 6.2
O FreeBSD preserva a barra desde o commit de 04/10/2004 (com um log de commit "Descubra como minhas roupas íntimas são à prova de chamas" ), mas inicialmente não quando estava abaixoPOSIXLY_CORRECT
, até que eles se lembraram de verificar uma década depois que o POSIX estava agora obrigando-o a que ponto foi feito também no modo POSIX .
O commit inicial do FreeBSD menciona que o Solaris já estava fazendo naquele momento.
O @JdePB (no comentário abaixo) descobriu que o link para uma matéria privilegiada da Sun corroborava e fornecia mais detalhes sobre a origem do Solaris e sugeria que o Solaris já tinha a salvaguarda em vigor antes de fazer a solicitação ao grupo de Austin.
Explica a justificativa para adicionar essa exclusão. Enquanto um só pode culpar a si mesmo se eles fizerem isso rm -rf /
, há um caso em que um script poderia fazê-lo se fazer rm -rf -- "$1/$2"
sem verificar que $1
/ $2
foram fornecidos que é a coisa que atingiu alguns Sun clientes ruim quando aplicar erradamente um patch Solaris (de acordo com esse link).
A proibição de exclusão .
e ..
foi adicionada muito antes disso e novamente para proteger contra possíveis contratempos. rm
ainda é um comando perigoso. Ele faz o que deve fazer: remova o que você mandou.
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/*
Também removeria tudo. Sabe-se que a conclusão do nome de arquivo do shell causa esses problemas quando você faz
rm -rf someth<Tab>/*
Expandido para:
rm -rf something /*
Porque something
assim aconteceu para não ser um diretório.
Os shells gostam tcsh
ou zsh
adicionam um prompt extra ao tentar chamar rm
com um *
curinga ( tcsh
não por padrão).