İçin POSIX spec son (2017 itibariyle) versiyonu rm
yardımcı olan burada (ve önceki bir orada ) ve silinmesini yasaklayan .
ve ..
.
Dosya noktalarından veya nokta noktalarından biri bir işlenenin temel adı (yani, son yol adı bileşeni) olarak belirtilirse veya bir işlenen kök dizine çözümlenirse, rm standart hataya bir tanılama mesajı yazmalı ve hiçbir şey yapmamalı Bu tür operandlarla daha fazlası.
@Jlliagre tarafından belirtildiği gibi, yaklaşık kısmı /
SUSv4'te bir eklemedir.
GNU fileutils changelog'daki yorumların eski POSIX özelliklerinde zaten geçerli olduğunu öne sürmesine rağmen, bulabildiğim ve piyasada bulunan en eski Unix özelliği ( XPF4 CAE rev2 (1994)) zaten belirtilmiş .
ve ..
kaldırılamıyor.
O uygulandığını unutmayın dir/..
ve ../
de ancak (Solaris 11 ve MacOS gibi UNIX sertifikalı olanlar dahil) bazı uygulamalar hala karşı korumak yok rm -rf ../
ya rm -rf .*/
).
Tarih
Erken birlik
Unix V3'te (1973) eklenmiş olan -r
seçenek rm
yalnızca dizinlerin içeriğini siliyor olmasına rağmen, dizinleri rmdir
kaldırmak için kullanmanız gerekir .
Bu, Unix V7'de değişti (1979, aynı zamanda Bourne kabuğunu da tanıtan ve çoğu Unicesinin türetildiği sürüm). rm -r
şimdi dizinleri de kaldırdık ve ..
dizin ağacını silmedik. Adam sayfa devletler:
..
Yanlışlıkla böyle bir şey yapmanın antisosyal sonuçlarından kaçınmak için dosyayı kaldırmak yasaktır rm -r .*
.
(kişi dahil olduğu için her şeyi sildiğirm -r .*
için hala antisosyal olduğunu iddia edebilir .
).
Hala kaldırmak için kabul etmedi .
o bağlantısını kaldırmak olmaz gerçi .
veya ..
girdileri. Öyleyse rm -r .
, geçerli dizini boşaltmanın etkili bir yoluydu.
Ayrıca, korumanın yalnızca veya ..
değil , yalnızca bir argüman için olduğunu unutmayın . Yani, yine de ana dizindeki her şeyi yinelemeli olarak kaldıracaktı.dir/..
./..
rm -rf ./.*
Bunun, dünyaların içerebilecekleri .
ve ..
genişlemelerinde kullanabilecekleri hatayı / kötümseriliği gidermek için zaten olduğunu görmek ilginçtir . Yani Forsyth kabuk 80'lerin sonunda (orijinal Minix kabuk ve pdksh temeli), giderilmiştir zsh
(1990) ve fish
(2005) ancak diğer kabukları ve POSIX özellikle sh
genişlemesini gerektirir dil .*
dahil etmek .
ve ..
eğer onlar tarafından döndürülen readdir()
( bash
sadece kısmen sorunu giderir shopt -s dotglob
hariç globs (burada .xxx
olanlar) dahil değildir .
ya ..
ve birlikte ksh
, aşağıdakileri yaparak düzeltebilirsiniz FIGNORE='@(.|..)'
).
Aynı zamanda tam olarak yasaklayan .
ne zaman eklendiği her zaman net değildir ve her Unix ile değişir. Aşağıdaki birkaç bulgu.
BSD
Yasaklayıcı .
2.9BSD (1983) ve 2.10BSD (1987) ile 4.2BSD (1983) ve 4.3 BSD (1986) arasına bazen eklendi (bkz bu değişiklik unix-tarih-repo 1985 timestamped ).
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.9BSD/root.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `..'
$ wget -qO- http://www.tuhs.org/Archive/PDP-11/Distributions/ucb/2.10bsd.tar.gz |
zgrep -ao 'rm: canno[[:print:]]*'
rm: cannot remove `.' or `..'
rm: cannot remove `.' or `..'\n");
İçin dir/.
ve dir/..
bakın 1988 yılında bu değişikliği (BSD 4.3 Net / 1).
Bu tarihe kadar, rm
FreeBSD'nin (ve macOS gibi türevleri) halen geçerli ya da ana dizini üzerine rm -rf ./
ya da rm -rf ../
olsa boşaltır (bunun için önemlidir rm -rf .*/
).
Sistem V
V7'den sonra AT&T Unix türevleri için ne kaynak ne de ikili olarak halka açık bir bilgim yok. Onun çevrimiçi kılavuzda, (Sistem III dayanarak) HPUX hala sadece yasaklar bahseder ..
etkili bir muhtemelen en az SysIII silinmesini engel olmazsa bir gösterge olan hem yasaklamaktadır iken .
( düzenlemek Şimdi bakarak: SysIII rm
kaynak kodu , bu kadar Unix V7'den bu yana neredeyse hiç değişmedi).
Kontrol ettiğim diğer tüm çevrimiçi kılavuzlar siliniyor .
veya ..
POSIX uyumlu olması beklenen yasak.
Solaris rm
, geçerli veya ana dizini rm -rf ./
veya üzerine hala boşaltır rm -rf ../
.
GNU
GNU fileutils için erken değişiklik günlüğü tüm tarihi bilgiler.
Başlangıçta ne silme iken .
veya ..
yasaktı, ..
ilk yasaklandı ve daha sonra her ikisi (dahil dir/.
tüm 1990 ve 1991 yılları arasında,).
diğer
Gördüğümüz gibi, içinde (veya herhangi bir kürenin) zsh
genişlemesi .*
hiçbir zaman .
veya ..
( sh
emülasyon modunda bile) içermez. rm
(Eğer eğer olsun yerleşik zmodload zsh/files
) bu nedenle tedavi etmez .
veya ..
özel olarak. Yani, bununla zsh
yerleşiğini yapabilirsiniz rm -rf .
veya rm -rf ..
boşaltmak .
veya ..
ancak rm -rf .*
kaldırmaz .
ya ..
.
Meşgul kutusunda rm
, silme yasağı .
ve ..
0.52 (2001) 'de eklenmiştir.
rm
, ama yine de beklenmedik sonuçlara sahip olabileceğini kayda değer olduğunu düşündümchmod
,chown
eşleştirme yaparken, vb.*
.