Versi POSIX spec terbaru untuk per rm
utilitas ada di sini (dan yang sebelumnya ada ) dan melarang penghapusan .
dan ..
.
Jika salah satu dari file dot atau dot-dot ditentukan sebagai bagian nama dasar dari operan (yaitu, komponen pathname akhir) atau jika operan memutuskan ke direktori root, rm harus menulis pesan diagnostik untuk kesalahan standar dan tidak melakukan apa pun. lebih banyak dengan operan tersebut.
Seperti dicatat oleh @jlliagre, bagian tentang /
adalah tambahan di SUSv4.
Spesifikasi Unix tertua yang tersedia untuk umum yang dapat saya temukan ( XPF4 CAE rev2 (1994)), sudah menentukan itu .
dan ..
tidak dapat dihapus, meskipun komentar dalam fileel GNU changelog menyarankan itu sudah menjadi kasus dalam spesifikasi POSIX yang lebih lama.
Perhatikan bahwa ini berlaku untuk dir/..
dan ../
juga, tetapi beberapa implementasi (termasuk yang disertifikasi UNIX seperti Solaris 11 dan macOS) masih tidak melindungi terhadap rm -rf ../
atau rm -rf .*/
).
sejarah
Unifikasi awal
The -r
pilihan untuk rm
ditambahkan pada Unix V3 (1973) meskipun hanya menghapus isi dari direktori, Anda masih perlu menggunakan rmdir
untuk menghapus direktori.
Itu berubah di Unix V7 (1979, rilis yang juga memperkenalkan shell Bourne dan dari mana sebagian besar Unives berasal). rm -r
direktori sekarang dihapus juga dan tidak akan menghapus ..
pohon direktori. The man page negara:
Dilarang menghapus file ..
hanya untuk menghindari konsekuensi antisosial dari melakukan sesuatu secara tidak sengaja rm -r .*
.
(Meskipun orang mungkin berpendapat bahwa rm -r .*
itu masih antisosial karena menghapus semuanya karena .
sudah termasuk).
Itu masih menerima untuk menghapus .
meskipun itu tidak akan membatalkan tautan .
atau ..
entri. Maka, rm -r .
merupakan cara yang efektif untuk mengosongkan direktori saat ini.
Perhatikan juga bahwa perlindungan hanya untuk ..
argumen literal , bukan untuk dir/..
atau ./..
. Jadi, rm -rf ./.*
masih akan menghapus semua yang ada di direktori induk secara rekursif.
Sangat menarik untuk melihat bahwa itu sudah bisa diatasi dengan bug / misfeature dimana glob dapat memasukkan .
dan ..
dalam ekspansi mereka. Itu diperbaiki di shell Forsyth (dasar untuk shell Minix asli dan pdksh) pada akhir 80-an, zsh
(1990) dan fish
(2005) tetapi tidak pada shell lain dan khususnya bukan sh
bahasa POSIX yang memerlukan perluasan .*
untuk memasukkan .
dan ..
jika mereka dikembalikan oleh readdir()
( bash
mengatasi masalah sebagian hanya dengan di shopt -s dotglob
mana gumpalan (kecuali .xxx
yang) tidak termasuk .
atau ..
, dan dengan ksh
, Anda dapat memperbaikinya dengan melakukan FIGNORE='@(.|..)'
).
Kapan tepatnya melarang .
juga ditambahkan tidak selalu jelas dan bervariasi dengan setiap Unix. Beberapa temuan di bawah ini.
BSD
The melarang dari .
ditambahkan kira antara 2.9BSD (1983) dan 2.10BSD (1987) dan antara 4.2BSD (1983) dan 4.3BSD (1986) (lihat perubahan ini timestamped 1985 di unix-sejarah-repo ).
$ 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");
Untuk dir/.
dan dir/..
, lihat perubahan ini pada tahun 1988 (BSD 4.3 Net / 1).
Sampai saat ini, rm
FreeBSD (dan turunannya seperti macOS) masih mengosongkan direktori saat ini atau induk pada rm -rf ./
atau rm -rf ../
meskipun (penting untuk rm -rf .*/
).
Sistem V
Saya tidak punya banyak informasi karena tidak ada sumber atau biner yang tersedia untuk umum untuk turunan AT&T Unix setelah V7. Dalam manual online-nya, HPUX (berdasarkan Sistem III) masih menyebutkan bahwa itu hanya melarang ..
sementara secara efektif melarang keduanya yang merupakan indikasi bahwa mungkin setidaknya SysIII tidak melarang penghapusan .
( sunting : Sekarang melihat kode sumber SysIIIrm
, itu hampir tidak berubah sejak Unix V7).
Semua manual online lain yang telah saya periksa menyebutkan penghapusan .
atau ..
dilarang yang diharapkan sesuai dengan POSIX.
Solaris rm
masih mengosongkan direktori saat ini atau induk pada rm -rf ./
atau rm -rf ../
.
GNU
The changelog awal untuk fileutils GNU memiliki semua informasi sejarah.
Meskipun awalnya tidak menghapus .
atau ..
dilarang, ..
pertama-tama dilarang dan kemudian keduanya (termasuk dir/.
), semua antara tahun 1990 dan 1991.
lain
Seperti yang kita lihat, zsh
ekspansi .*
(atau bola dunia apa pun) tidak pernah menyertakan .
atau ..
(bahkan dalam sh
mode emulasi). Oleh karena itu rm
builtin (yang Anda dapatkan jika Anda zmodload zsh/files
) tidak memperlakukan .
atau ..
khusus. Jadi, dengan zsh
builtin itu, Anda bisa rm -rf .
atau rm -rf ..
mengosongkan .
atau ..
, tetapi rm -rf .*
tidak akan menghapus .
atau ..
.
Dalam busybox rm
, larangan penghapusan .
dan ..
ditambahkan pada 0.52 (2001)
rm
, tapi saya pikir itu menyebutkan layak bahwa Anda masih dapat memiliki hasil yang tak terduga denganchmod
,chown
, dll ketika pencocokan.*
.