Dengan asumsi Anda tahu targetnya adalah tautan simbolik dan bukan file, apakah ada perbedaan antara menggunakan rm
dan unlink
menghapus tautan?
Dengan asumsi Anda tahu targetnya adalah tautan simbolik dan bukan file, apakah ada perbedaan antara menggunakan rm
dan unlink
menghapus tautan?
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
.
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
Saat Anda melihat 2 file log yang dihasilkan, Anda dapat "melihat" apa yang sebenarnya dilakukan oleh setiap panggilan.
Dengan unlink
itu memanggil unlink()
system call:
....
mmap(NULL, 106070960, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6d025cc000
close(3) = 0
unlink("file1") = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
....
Dengan rm
jalur yang sedikit berbeda:
....
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
geteuid() = 1000
newfstatat(AT_FDCWD, "file1", {st_mode=S_IFREG|0664, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
faccessat(AT_FDCWD, "file1", W_OK) = 0
unlinkat(AT_FDCWD, "file1", 0) = 0
lseek(0, 0, SEEK_CUR) = -1 ESPIPE (Illegal seek)
close(0) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
...
Sistem panggilan unlink()
dan unlinkat()
pada dasarnya sama kecuali perbedaan yang dijelaskan dalam halaman manual ini: http://linux.die.net/man/2/unlinkat .
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.
AT_FDCWD
, secara efektif tidak ada perbedaan antara unlink
dan unlinkat
.
POSIX menentukan bahwa unlink
utilitas memanggil fungsi C library unlink
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, maka unlink
akan menghapusnya.
rm
adalah perintah Unix tradisional yang memiliki sedikit fungsi lain, dan tidak cukup superset unlink
(lihat di bawah).
Pertama, rm
melakukan pemeriksaan keamanan. Jika Anda mencoba ke rm
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 halnya unlink
; Namun dengan -f
, rm
tidak mengeluh. Ini sering dieksploitasi di Makefiles ( clean: @rm -f $(OBJS) ...
) sehingga make 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 yang unlink
tidak perlu dilakukan, karena fungsi C library tidak melakukan itu.
The unlink
utilitas tidak persis dilucuti-down rm
. Ia melakukan subset dari apa yang rm
dilakukannya, tetapi memiliki semantik yang merupakan kombinasi rm
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
juga rm -f file
memenuhi persyaratan. rm file
akan menolak jika file tidak dapat ditulisi. Tetapi rm -f file
akan lalai untuk mengeluh jika file tersebut hilang. unlink file
melakukan pekerjaan.
unlink
mungkin diperkenalkan karena rm
terlalu pintar: kadang-kadang Anda hanya ingin unlink
semantik Unix murni : "tolong buat entri direktori ini hilang jika izin direktori mengizinkan" .
unlink
daripada perbedaan hanya menjelaskan.
Dengan satu file, rm dan hapus tautan melakukan tugas yang sama, hapus file tersebut. Seperti yang didefinisikan POSIX, rm
dan unlink
keduanya 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, unlink
bisa juga menghapus direktori. Paling tidak dalam sistem GNU, unlink
tidak pernah bisa menghapus nama direktori.