Ekspresi .*
diperluas oleh bash untuk memasukkan direktori saat ini dan direktori induk:
$ 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 .*
. ..
Jika saya menjalankan rm -rf .*
Debian menggunakan bash GNU, version 4.2.36(1)-release
dan rm
dari rm (GNU coreutils) 8.13
, saya menerima pesan ini:
$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'
Apakah ini masalah GNU atau POSIX? Apakah ada sistem * nix di mana perintah di atas akan dihapus .
dan ..
?
Juga, apakah ini fitur keamanan shell atau dari rm
perintah itu sendiri?
rm
, tapi saya pikir itu menyebutkan layak bahwa Anda masih dapat memiliki hasil yang tak terduga denganchmod
,chown
, dll ketika pencocokan.*
.Jawaban:
Versi POSIX spec terbaru untuk per
rm
utilitas ada di sini (dan yang sebelumnya ada ) dan melarang penghapusan.
dan..
.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 terhadaprm -rf ../
ataurm -rf .*/
).sejarah
Unifikasi awal
The
-r
pilihan untukrm
ditambahkan pada Unix V3 (1973) meskipun hanya menghapus isi dari direktori, Anda masih perlu menggunakanrmdir
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:(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 untukdir/..
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) danfish
(2005) tetapi tidak pada shell lain dan khususnya bukansh
bahasa POSIX yang memerlukan perluasan.*
untuk memasukkan.
dan..
jika mereka dikembalikan olehreaddir()
(bash
mengatasi masalah sebagian hanya dengan dishopt -s dotglob
mana gumpalan (kecuali.xxx
yang) tidak termasuk.
atau..
, dan denganksh
, Anda dapat memperbaikinya dengan melakukanFIGNORE='@(.|..)'
).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 ).Untuk
dir/.
dandir/..
, 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 padarm -rf ./
ataurm -rf ../
meskipun (penting untukrm -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 padarm -rf ./
ataurm -rf ../
.GNU
The changelog awal untuk fileutils GNU memiliki semua informasi sejarah.
Meskipun awalnya tidak menghapus
.
atau..
dilarang,..
pertama-tama dilarang dan kemudian keduanya (termasukdir/.
), semua antara tahun 1990 dan 1991.lain
Seperti yang kita lihat,
zsh
ekspansi.*
(atau bola dunia apa pun) tidak pernah menyertakan.
atau..
(bahkan dalamsh
mode emulasi). Oleh karena iturm
builtin (yang Anda dapatkan jika Andazmodload zsh/files
) tidak memperlakukan.
atau..
khusus. Jadi, denganzsh
builtin itu, Anda bisarm -rf .
ataurm -rf ..
mengosongkan.
atau..
, tetapirm -rf .*
tidak akan menghapus.
atau..
.Dalam busybox
rm
, larangan penghapusan.
dan..
ditambahkan pada 0.52 (2001)sumber
rm -rf . /
(perhatikan spasi) harus mencetak dua peringatan (untuk.
dan/
) dan keluar, tetapi kami sepertinya mendapatkan pertanyaan yang menanyakan bagaimana memulihkan dari itu setiap beberapa bulan.