Hedefin bir dosya değil sembolik bir bağlantı olduğunu bildiğinizi varsayarak, bağlantıyı kullanmak rm
ve unlink
kaldırmak arasında bir fark var mı?
Hedefin bir dosya değil sembolik bir bağlantı olduğunu bildiğinizi varsayarak, bağlantıyı kullanmak rm
ve unlink
kaldırmak arasında bir fark var mı?
Yanıtlar:
Ne zaman bu tür sorularınız olursa, gerçekte neler olduğunu görmek için küçük bir test yapmanın en iyisidir. Bunun için kullanabilirsiniz strace
.
$ touch file1
$ strace -s 2000 -o unlink.log unlink file1
$ touch file1
$ strace -s 2000 -o rm.log rm file1
Sonuçta ortaya çıkan 2 günlük dosyasına bir göz attığınızda, her aramanın gerçekte ne yaptığını "görebilirsiniz".
İle unlink
o çağırma oluyor unlink()
sistem çağrısı:
....
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) = ?
....
Bununla rm
biraz farklı bir yol var:
....
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 çağırır unlink()
ve unlinkat()
bu kılavuzda açıklanan farklılıklar dışında aslında aynıdır: http://linux.die.net/man/2/unlinkat .
Unlinkat () sistemi çağrısı, bu kılavuz sayfasında açıklanan farklılıklar dışında, unlink (2) veya rmdir (2) ile aynı şekilde çalışır (bayrakların AT_REMOVEDIR bayrağını içerip içermediğine bağlı olarak).
Yol adında verilen yol adı göreceli ise, dosya tanıtıcısı dirfd tarafından belirtilen dizine (yorumlama işleminin geçerli çalışma dizinine göre yerine, unlink (2) ve rmdir (2) tarafından yapıldığı gibi yorumlanır. (göreceli bir yol adı için).
Yol adında verilen yol adı göreceli ve dirfd, AT_FDCWD özel değeri ise, yol adı çağrı işleminin geçerli çalışma dizinine göre yorumlanır (unlink (2) ve rmdir (2) gibi).
Eğer yol adında verilen yol adı mutlak ise, dirfd yoksayılır.
AT_FDCWD
, unlink
ve arasında etkili bir fark yoktur unlinkat
.
POSIX, unlink
yardımcı programın C kütüphanesi unlink
işlevini çağırdığını ve başka bir şey olmadığını belirtir . Başka seçenek yok. Dizin olmayan bir şeye geçerli bir yol adı iletirseniz ve o nesnenin bulunduğu dizine yazma izniniz varsa, o unlink
zaman kaldırır.
rm
biraz başka bir işlevselliğe sahip olan ve pek de bir süperset olmayan geleneksel bir Unix komutudur unlink
(aşağıya bakınız).
İlk olarak, rm
güvenlik kontrolleri yapar. rm
Yazma iznine sahip olmadığınız bir nesneyi denerseniz (kaldırma yetkisi ile ilgisi yoktur: doğrudan izinler!) rm
Yine de -f
belirtilmediği sürece reddeder . rm
normalde, dosya olmadığı gibi şikayet eder unlink
; Bununla birlikte -f
, rm
şikayet etmez. Bu genellikle Makefiles'de ( clean: @rm -f $(OBJS) ...
) kullanılır, bu nedenle make clean
kaldırılacak hiçbir şey olmadığında başarısız olmaz.
İkinci olarak, etkileşimli olarak silme işlemini onaylama seçeneğine rm
sahiptir -i
.
Üçüncü olarak, rm
sahip -r
yinelemeli bir şeydir bir dizin, kaldırılması için unlink
C kütüphanesi işlevi bunu yapmaz, çünkü yapmak gerekli değildir.
Yardımcı unlink
program tam olarak soyulmamış değil rm
. Bu şeyin bir alt kümesini gerçekleştirir rm
, ama bunun bir kombinasyonudur anlambilim içeriyor rm
ile -f
ve rm olmadan -f
.
Kendi izinlerinin ne olduğuna bakılmaksızın düzenli bir dosyayı silmek istediğinizi varsayalım. Ayrıca, dosya yoksa veya başka bir nedenden dolayı komutun başarısız olmasını istediğinizi varsayalım. Ne rm file
ne de rm -f file
gereksinimleri karşılamaktadır. rm file
dosya yazılabilir değilse reddeder. Ancak rm -f file
dosya eksikse şikayet etmeyi ihmal eder. unlink file
işi yapar.
unlink
Muhtemelen tanıtıldı çünkü rm
çok zekice: bazen sadece saf Unix unlink
anlambilimine sahip olmak istiyorsun : "Dizin izinleri izin veriyorsa lütfen bu dizin girişini kaldırın" .
unlink
sadece açıklayan farklılıklardan ziyade.
Tek bir dosya ile, rm ve unlink aynı görevi yapmak, dosyayı kaldırmak. POSIX tanımlandığı gibi rm
ve unlink
her ikisi de unlink () sistem çağrısına çağrı yapar.
GNU'da rm
, bu çağrılar () unlinkat eşdeğerdir sistemi aramayı unlink()
veya Rmdir () yolu göreli bir yol belirtildiği durumlar dışında işlevi.
Not
Bazı sistemlerde, unlink
dizini de kaldırabilirsiniz. En azından GNU sisteminde, unlink
bir dizinin adını asla silemezsiniz.