GNU/Linux >> Belajar Linux >  >> Linux

Apakah 'rm .*' Pernah Menghapus Direktori Induk?

Ekspresi .* diperluas oleh bash untuk menyertakan 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 .* di Debian saya menggunakan GNU bash, version 4.2.36(1)-release dan rm dari rm (GNU coreutils) 8.13 , saya mendapatkan pesan ini:

$ rm -rf .*
rm: cannot remove directory: `.'
rm: cannot remove directory: `..'

Apakah ini hal GNU atau POSIX? Apakah ada sistem *nix di mana perintah di atas akan menghapus . dan .. ?

Juga, apakah ini fitur keamanan shell atau rm perintah itu sendiri?

Jawaban yang Diterima:

Versi terbaru (per 2017) dari spesifikasi POSIX untuk rm utilitas ada di sini (dan yang sebelumnya di sana) dan melarang penghapusan . dan .. .

Jika salah satu file dot atau dot-dot ditentukan sebagai bagian nama dasar operan (yaitu, komponen nama jalur akhir) atau jika operan diselesaikan ke direktori root, rm akan menulis pesan diagnostik ke kesalahan standar dan tidak melakukan apa pun lebih banyak dengan operan seperti itu.

Seperti yang 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 menetapkan . itu. dan .. tidak dapat dihapus, meskipun komentar di log perubahan fileutils GNU menyarankan bahwa hal itu sudah terjadi pada spesifikasi POSIX yang lebih lama.

Perhatikan bahwa ini berlaku untuk dir/.. dan ../ juga, tetapi beberapa implementasi (termasuk yang bersertifikasi UNIX seperti Solaris 11 dan macOS) masih tidak terlindungi dari rm -rf ../ atau rm -rf .*/ ).

sejarah

Unice awal

-r pilihan untuk rm telah ditambahkan di Unix V3 (1973) meskipun hanya menghapus konten 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 Unix berasal). rm -r sekarang menghapus direktori juga dan tidak akan menghapus .. pohon direktori. Halaman manual menyatakan:

Dilarang menghapus file .. hanya untuk menghindari konsekuensi antisosial dari melakukan sesuatu seperti rm -r .* secara tidak sengaja .

(meskipun orang mungkin berpendapat bahwa rm -r .* masih antisosial karena menghapus semuanya karena . disertakan).

Itu masih menerima untuk menghapus . meskipun itu tidak akan memutuskan tautan . atau .. entri. Jadi, rm -r . adalah cara yang efektif untuk mengosongkan direktori saat ini.

Perhatikan juga bahwa perlindungan hanya untuk .. literal argumen, 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 untuk mengatasi bug/misfeature dimana glob dapat menyertakan . dan .. dalam ekspansi mereka. Itu diperbaiki di shell Forsyth (dasar untuk shell Minix asli dan pdksh) di akhir 80-an, zsh (1990) dan fish (2005) tetapi bukan shell lain dan khususnya bukan POSIX sh bahasa yang membutuhkan perluasan .* untuk menyertakan . dan .. jika dikembalikan oleh readdir() (bash mengatasi masalah sebagian hanya dengan shopt -s dotglob di mana gumpalan (kecuali .xxx yang) tidak termasuk . atau .. , dan dengan ksh , Anda dapat memperbaikinya dengan melakukan FIGNORE='@(.|..)' ).

Terkait:Bagaimana cara menghapus file yang sedang digunakan oleh proses lain??

Kapan tepatnya melarang . juga ditambahkan tidak selalu jelas dan bervariasi dengan masing-masing Unix. Beberapa temuan di bawah ini.

BSD

Pelarangan . ditambahkan antara 2.9BSD (1983) dan 2.10BSD (1987) dan antara 4.2BSD (1983) dan 4.3BSD (1986) (lihat perubahan ini diberi cap waktu 1985 di unix-history-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 dari FreeBSD (dan turunannya seperti macOS) masih mengosongkan direktori saat ini atau induknya pada rm -rf ./ atau rm -rf ../ meskipun (penting untuk rm -rf .*/ ).

Sistem V

Saya tidak memiliki banyak informasi karena baik sumber maupun biner tidak tersedia untuk umum untuk turunan AT&T Unix setelah V7. Dalam manual onlinenya, HPUX (berdasarkan Sistem III) masih menyebutkan bahwa hanya melarang .. sementara secara efektif melarang keduanya yang merupakan indikasi bahwa mungkin setidaknya SysIII tidak melarang penghapusan . (edit :Sekarang melihat rm SysIII kode sumber, hampir tidak berubah sejak Unix V7).

Semua manual online lainnya yang telah saya periksa menyebutkan menghapus . atau .. dilarang yang diharapkan sesuai dengan POSIX.

Solaris rm masih mengosongkan direktori saat ini atau induk pada rm -rf ./ atau rm -rf ../ .

GNU

Log perubahan awal untuk fileutils GNU memiliki semua informasi historis.

Meskipun awalnya tidak menghapus . atau .. dilarang, .. dilarang terlebih dahulu dan kemudian keduanya (termasuk dir/. ), semuanya antara tahun 1990 dan 1991.

lainnya

Seperti yang kita lihat, di zsh , perluasan .* (atau glob apa pun) tidak pernah menyertakan . atau .. (bahkan dalam sh modus emulasi). rm builtin (yang Anda dapatkan jika Anda zmodload zsh/files ) oleh karena itu tidak memperlakukan . atau .. khususnya. Jadi, dengan zsh itu bawaan, Anda dapat rm -rf . atau rm -rf .. untuk mengosongkan . atau .. , tetapi rm -rf .* tidak akan menghapus . atau .. .

Di busybox rm , larangan penghapusan . dan .. ditambahkan pada 0.52 (2001)


Linux
  1. 5 Contoh Praktis Untuk Menghapus / Menghapus Direktori di Linux

  2. Hapus symlink ke direktori

  3. Bagaimana cara mengatur direktori kerja dari proses induk?

  1. Apa yang dihasilkan pwd?

  2. Apa cara tercepat untuk menghapus semua file &subfolder dalam direktori?

  3. Cara unlink (menghapus) hardlink khusus. dibuat untuk folder?

  1. Bagaimana Cara Menginstal R 3.3.1 Di Direktori Sendiri?

  2. Rsync Apakah Mengubah Izin Direktori?

  3. Apa arti ./ (dot slash) di linux?