Hedefin bir dosya değil sembolik bir bağlantı olduğunu bildiğinizi varsayarak, bağlantıyı kullanmak rmve unlinkkaldı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 rmve unlinkkaldı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 unlinko ç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 rmbiraz 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, unlinkve arasında etkili bir fark yoktur unlinkat.
POSIX, unlinkyardımcı programın C kütüphanesi unlinkiş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 unlinkzaman kaldırır.
rmbiraz 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, rmgüvenlik kontrolleri yapar. rmYazma iznine sahip olmadığınız bir nesneyi denerseniz (kaldırma yetkisi ile ilgisi yoktur: doğrudan izinler!) rmYine de -fbelirtilmediği sürece reddeder . rmnormalde, 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 cleankaldırılacak hiçbir şey olmadığında başarısız olmaz.
İkinci olarak, etkileşimli olarak silme işlemini onaylama seçeneğine rmsahiptir -i.
Üçüncü olarak, rmsahip -ryinelemeli bir şeydir bir dizin, kaldırılması için unlinkC kütüphanesi işlevi bunu yapmaz, çünkü yapmak gerekli değildir.
Yardımcı unlinkprogram 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 filene de rm -f filegereksinimleri karşılamaktadır. rm filedosya yazılabilir değilse reddeder. Ancak rm -f filedosya eksikse şikayet etmeyi ihmal eder. unlink fileişi yapar.
unlinkMuhtemelen tanıtıldı çünkü rmçok zekice: bazen sadece saf Unix unlinkanlambilimine sahip olmak istiyorsun : "Dizin izinleri izin veriyorsa lütfen bu dizin girişini kaldırın" .
unlinksadece açıklayan farklılıklardan ziyade.
Tek bir dosya ile, rm ve unlink aynı görevi yapmak, dosyayı kaldırmak. POSIX tanımlandığı gibi rmve unlinkher 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, unlinkdizini de kaldırabilirsiniz. En azından GNU sisteminde, unlinkbir dizinin adını asla silemezsiniz.