Wyrażenie .*
jest rozwijane przez bash, aby uwzględnić katalogi bieżący i nadrzędny:
$ 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 .*
. ..
Jeśli uruchomię rm -rf .*
na moim Debianie używając GNU bash version 4.2.36(1)-release
i rm
od rm (GNU coreutils) 8.13
, otrzymam ten komunikat:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
Czy to kwestia GNU, czy POSIX? Czy istnieją systemy * nix, w których powyższe polecenie po cichu usunie .
i ..
?
Czy jest to również funkcja bezpieczeństwa powłoki lub rm
samego polecenia?
rm
, ale myślałem, że to warto wspomnieć, że nadal można mieć nieoczekiwane rezultatychmod
,chown
itp podczas dopasowywania.*
.Odpowiedzi:
Najnowsza (od 2017 r.) Wersja specyfikacji POSIX dla tego
rm
narzędzia jest tutaj (i poprzednia tam ) i zabrania usuwania.
i..
.Jak zauważył @jlliagre, część o
/
jest dodatkiem do SUSv4.Najstarsza publicznie dostępna specyfikacja Uniksa, którą mogłem znaleźć ( XPF4 CAE rev2 (1994)), już ją określiła
.
i..
nie można jej usunąć, chociaż komentarze w dzienniku zmian plików GNU sugerują, że tak było już w przypadku starszych specyfikacji POSIX.Należy pamiętać, że dotyczy to
dir/..
i../
tak dobrze, ale niektóre implementacje UNIX (w tym certyfikowanych tacy jak Solaris 11 i MacOS) nadal nie zabezpieczyć przedrm -rf ../
lubrm -rf .*/
).historia
Wczesne jednorożce
-r
Opcjarm
została dodana w Unix V3 (1973), choć to był tylko usuwanie zawartości katalogów, to trzeba jeszcze używaćrmdir
do usuwania katalogów.Zmieniło się to w Unixie V7 (1979, wydaniu, które wprowadziło również powłokę Bourne'a i z którego wywodzi się większość Unices).
rm -r
teraz również usunął katalogi i nie usunął..
drzewa katalogów. Do strona człowiek stwierdza:(choć można się spierać, że
rm -r .*
nadal jest aspołeczna, ponieważ usuwa wszystko, ponieważ.
jest uwzględniona).Nadal zgodził się na usunięcie,
.
chociaż nie rozłączyłby wpisów.
ani..
. Tak więc,rm -r .
jest skutecznym sposobem, aby opróżnić katalog bieżący.Zauważ też, że zabezpieczenie było tylko dla dosłownego
..
argumentu, a nie dladir/..
lub./..
. Tak więcrm -rf ./.*
nadal rekurencyjnie usuwałbym wszystko z katalogu macierzystego.Interesujące jest to, że miało to już na celu obejście błędu / nieprawidłowego działania, za pomocą którego globusy mogą obejmować
.
i..
ich ekspansję. Zostało to naprawione w powłoce Forsyth (podstawa oryginalnej powłoki Minix i pdksh) pod koniec lat 80.,zsh
(1990) ifish
(2005), ale nie w innych powłokach, w szczególności nie wsh
języku POSIX , który wymaga rozszerzenia o.*
włączenie.
i..
jeśli są zwracane przezreaddir()
(bash
rozwiązuje problem częściowo tylko wtedy, gdyshopt -s dotglob
globusy (z wyjątkiem.xxx
tych) nie zawierają.
lub..
, i przy pomocyksh
, można to naprawić wykonującFIGNORE='@(.|..)'
).Kiedy
.
również dodano dokładnie zakaz, nie zawsze jest jasne i zmienia się w zależności od Unixa. Kilka ustaleń poniżej.BSD
Zabronienie
.
dodano w okresie między 2.9BSD (1983) oraz 2.10BSD (1987) oraz pomiędzy BSD 4.2 (1983) i BSD 4.3 (1986) (patrz w tym zmiana o czasie, w 1985 roku w UNIX-historii repo ).Dla
dir/.
idir/..
zobacz tę zmianę w 1988 r. (BSD 4.3 Netto / 1).Do tej pory,
rm
z FreeBSD (i jego pochodne, takie jak MacOS) nadal opróżnia aktualny lub nadrzędnego katalogu narm -rf ./
lubrm -rf ../
chociaż (sprawy orm -rf .*/
).System V.
Nie mam zbyt wielu informacji, ponieważ ani źródło, ani pliki binarne nie są publicznie dostępne dla pochodnych AT&T Unix po V7. W swoim podręczniku online HPUX (oparty na systemie III) wciąż wspomina, że zabrania tylko,
..
podczas gdy skutecznie zabrania obu, co oznacza, że prawdopodobnie przynajmniej SysIII nie zabraniał usuwania.
( edytuj : Teraz patrząc na kod źródłowy SysIIIrm
, jest to praktycznie bez zmian od Unixa V7).Wszystkie inne podręczniki online, które sprawdziłem, wspominają o usunięciu
.
lub..
są zabronione, co powinno być zgodne z POSIX.Solaris
rm
nadal opróżnia katalog bieżący lub nadrzędny w katalogurm -rf ./
lubrm -rf ../
.GNU ANTYLOPA
Wcześnie changelog dla fileutils GNU posiada wszystkie informacje historyczne.
Chociaż początkowo ani usuwanie
.
lub..
zostały zakazane,..
było zabronione, a potem oboje (włączniedir/.
), wszystkie w latach 1990 i 1991.inny
Jak widzieliśmy,
zsh
ekspansja.*
(lub dowolnego globu) nigdy nie obejmuje.
lub..
(nawet wsh
trybie emulacji).rm
Wbudowane (które można uzyskać, jeślizmodload zsh/files
) dlatego nie traktuje.
lub..
specjalnie. Tak więc, dzięki temuzsh
wbudowanemu możeszrm -rf .
lubrm -rf ..
opróżnić.
lub..
, alerm -rf .*
nie usuniesz.
lub..
.W busybox
rm
zabroniono usuwania.
i..
dodano w 0.52 (2001)źródło
rm -rf . /
(zwróć uwagę na spację) należy wydrukować dwa ostrzeżenia (dla.
i/
) i wyjść, ale wydaje się, że co kilka miesięcy pojawia się pytanie, jak się z tego zregenerować.