@ slm ♦ Jawabannya sesuai dengan pertanyaan itu, tetapi pertanyaan ini berbeda, katanya: "Anggap Anda tahu targetnya adalah tautan simbolik dan bukan file".
Stéphane Gourichon
Sepertinya Anda tidak menerima jawaban di sini @IQAndreas. Silakan lakukan jika mereka membantu Anda.
Gray
Jawaban:
56
Kapan pun Anda memiliki pertanyaan seperti ini, sebaiknya Anda melakukan sedikit tes untuk melihat apa yang sebenarnya terjadi. Untuk ini, Anda dapat menggunakan strace.
Sistem panggilan unlink()dan unlinkat()pada dasarnya sama kecuali perbedaan yang dijelaskan dalam halaman manual ini: http://linux.die.net/man/2/unlinkat .
kutipan
Panggilan sistem unlinkat () beroperasi dengan cara yang persis sama seperti membatalkan tautan (2) atau rmdir (2) (tergantung pada apakah flag menyertakan atau tidaknya flag AT_REMOVEDIR) kecuali perbedaan yang dijelaskan dalam halaman manual ini.
Jika pathname yang diberikan dalam pathname relatif, maka itu ditafsirkan relatif terhadap direktori yang dirujuk oleh file descriptor dirfd (bukan relatif terhadap direktori kerja saat ini dari proses pemanggilan, seperti yang dilakukan oleh unlink (2) dan rmdir (2) ) untuk nama path relatif).
Jika pathname yang diberikan dalam pathname adalah relatif dan dirfd adalah nilai khusus AT_FDCWD, maka pathname ditafsirkan relatif terhadap direktori kerja saat ini dari proses pemanggilan (seperti unlink (2) dan rmdir (2)).
Jika pathname yang diberikan dalam pathname adalah absolut, maka dirfd diabaikan.
Karena memberi AT_FDCWD, secara efektif tidak ada perbedaan antara unlinkdan unlinkat.
Barmar
6
Itu membuat saya senang membaca jawaban ini karena saya hanya "belajar memancing" dengan cara yang kuat dan fleksibel ketika sering saya mendapatkan ikan atau kadang-kadang saya "belajar memancing" dengan cara dasar pada SO :-)
sage
22
POSIX menentukan bahwa unlinkutilitas memanggil fungsi C library unlinkdan tidak ada yang lain. Tidak ada pilihan. Jika Anda memberikan nama jalur yang valid ke sesuatu yang bukan direktori, dan jika Anda memiliki izin menulis ke direktori tempat objek itu hidup, maka unlinkakan menghapusnya.
rmadalah perintah Unix tradisional yang memiliki sedikit fungsi lain, dan tidak cukup superset unlink(lihat di bawah).
Pertama, rmmelakukan pemeriksaan keamanan. Jika Anda mencoba ke rmobjek yang Anda tidak memiliki izin menulis (yang tidak relevan dengan kemampuan Anda untuk menghapusnya: izin langsung adalah!) rmNamun menolak kecuali -fditentukan. rmbiasanya mengeluh jika file tidak ada, seperti halnya unlink; Namun dengan -f, rmtidak mengeluh. Ini sering dieksploitasi di Makefiles ( clean: @rm -f $(OBJS) ...) sehingga make cleantidak gagal ketika tidak ada yang dihapus.
Kedua, rmmemiliki -iopsi untuk mengkonfirmasi penghapusan secara interaktif.
Ketiga, rmmemiliki -runtuk menghapus direktori secara rekursif, yang merupakan sesuatu yang unlinktidak perlu dilakukan, karena fungsi C library tidak melakukan itu.
The unlinkutilitas tidak persis dilucuti-down rm. Ia melakukan subset dari apa yang rmdilakukannya, tetapi memiliki semantik yang merupakan kombinasi rmdengan-f dan rm tanpa-f .
Misalkan Anda hanya ingin menghapus file biasa terlepas dari apa izinnya sendiri. Lebih jauh, anggap Anda ingin perintah gagal jika file tidak ada, atau alasan lain. Tidak rm filejuga rm -f filememenuhi persyaratan. rm fileakan menolak jika file tidak dapat ditulisi. Tetapi rm -f fileakan lalai untuk mengeluh jika file tersebut hilang. unlink filemelakukan pekerjaan.
unlinkmungkin diperkenalkan karena rmterlalu pintar: kadang-kadang Anda hanya ingin unlinksemantik Unix murni : "tolong buat entri direktori ini hilang jika izin direktori mengizinkan" .
Ini jawaban paling jelas di sini. Ini benar-benar memberikan kasus penggunaan untuk unlinkdaripada perbedaan hanya menjelaskan.
Wildcard
19
Dengan satu file, rm dan hapus tautan melakukan tugas yang sama, hapus file tersebut. Seperti yang didefinisikan POSIX, rmdan unlinkkeduanya memanggil untuk membatalkan tautan () panggilan sistem.
Dalam GNU rm, ia memanggil ke unlinkat () system call, yang setara dengan fungsi unlink()atau rmdir () kecuali dalam kasus di mana path menentukan path relatif.
Catatan
Pada beberapa sistem, unlinkbisa juga menghapus direktori. Paling tidak dalam sistem GNU, unlinktidak pernah bisa menghapus nama direktori.
Jawaban:
Kapan pun Anda memiliki pertanyaan seperti ini, sebaiknya Anda melakukan sedikit tes untuk melihat apa yang sebenarnya terjadi. Untuk ini, Anda dapat menggunakan
strace
.batalkan tautan
rm
Saat Anda melihat 2 file log yang dihasilkan, Anda dapat "melihat" apa yang sebenarnya dilakukan oleh setiap panggilan.
Kerusakan
Dengan
unlink
itu memanggilunlink()
system call:Dengan
rm
jalur yang sedikit berbeda:Sistem panggilan
kutipanunlink()
danunlinkat()
pada dasarnya sama kecuali perbedaan yang dijelaskan dalam halaman manual ini: http://linux.die.net/man/2/unlinkat .sumber
AT_FDCWD
, secara efektif tidak ada perbedaan antaraunlink
danunlinkat
.POSIX menentukan bahwa
unlink
utilitas memanggil fungsi C libraryunlink
dan tidak ada yang lain. Tidak ada pilihan. Jika Anda memberikan nama jalur yang valid ke sesuatu yang bukan direktori, dan jika Anda memiliki izin menulis ke direktori tempat objek itu hidup, makaunlink
akan menghapusnya.rm
adalah perintah Unix tradisional yang memiliki sedikit fungsi lain, dan tidak cukup supersetunlink
(lihat di bawah).Pertama,
rm
melakukan pemeriksaan keamanan. Jika Anda mencoba kerm
objek yang Anda tidak memiliki izin menulis (yang tidak relevan dengan kemampuan Anda untuk menghapusnya: izin langsung adalah!)rm
Namun menolak kecuali-f
ditentukan.rm
biasanya mengeluh jika file tidak ada, seperti halnyaunlink
; Namun dengan-f
,rm
tidak mengeluh. Ini sering dieksploitasi di Makefiles (clean: @rm -f $(OBJS) ...
) sehinggamake clean
tidak gagal ketika tidak ada yang dihapus.Kedua,
rm
memiliki-i
opsi untuk mengkonfirmasi penghapusan secara interaktif.Ketiga,
rm
memiliki-r
untuk menghapus direktori secara rekursif, yang merupakan sesuatu yangunlink
tidak perlu dilakukan, karena fungsi C library tidak melakukan itu.The
unlink
utilitas tidak persis dilucuti-downrm
. Ia melakukan subset dari apa yangrm
dilakukannya, tetapi memiliki semantik yang merupakan kombinasirm
dengan-f
dan rm tanpa-f
.Misalkan Anda hanya ingin menghapus file biasa terlepas dari apa izinnya sendiri. Lebih jauh, anggap Anda ingin perintah gagal jika file tidak ada, atau alasan lain. Tidak
rm file
jugarm -f file
memenuhi persyaratan.rm file
akan menolak jika file tidak dapat ditulisi. Tetapirm -f file
akan lalai untuk mengeluh jika file tersebut hilang.unlink file
melakukan pekerjaan.unlink
mungkin diperkenalkan karenarm
terlalu pintar: kadang-kadang Anda hanya inginunlink
semantik Unix murni : "tolong buat entri direktori ini hilang jika izin direktori mengizinkan" .sumber
unlink
daripada perbedaan hanya menjelaskan.Dengan satu file, rm dan hapus tautan melakukan tugas yang sama, hapus file tersebut. Seperti yang didefinisikan POSIX,
rm
danunlink
keduanya memanggil untuk membatalkan tautan () panggilan sistem.Dalam GNU
rm
, ia memanggil ke unlinkat () system call, yang setara dengan fungsiunlink()
atau rmdir () kecuali dalam kasus di mana path menentukan path relatif.Catatan
Pada beberapa sistem,
unlink
bisa juga menghapus direktori. Paling tidak dalam sistem GNU,unlink
tidak pernah bisa menghapus nama direktori.sumber