“Realpath” ve “readlink -f” arasındaki fark nedir


68

realpathKomut hakkında ve readlink -fşu anda tavsiye edilmekle nasıl itiraz edildiği hakkında çok şey okudum . Bazı yerlerde, realpath'ın neden tanıtılmasının okuma bağlantısındaki bu işlevsellikten yoksun olduğu ve realpath'a artık ihtiyaç duyulmadığını ve desteğinin çoğu OS sağlayıcı tarafından durdurulduğunu gördüm.

Sorumun nedeni, birçok insanı readlink -f"oldukça benzer" bir emir olarak öneren bir realpathkomiser olarak görmemdir ve beni rahatsız eden de budur, çünkü hiç kimse bu "oldukça benzer" kısım üzerinde durmaz. Gerçek farklar neler?

Yanıtlar:


73

realpathEtrafında birkaç komut var.

Yardımcı realpathprogram, realpathkütüphane işlevlerinin etrafındaki bir sarmalayıcıdır ve birçok kez yeniden keşfedilmiştir .

Debian'ın muhafaza edilmesi için kullanılan realpath(bir paket ayrılmış den dwwwberi odunsu 2001 yılından bu yana paketleme ve belgeleri ile ilgili olarak başka değişmedi), ama şimdi aşamalı olmuştur. Bu yardımcı program kullanımdan kaldırılmıştır, çünkü artık daha standart alternatifler vardır (GNU readlinkve yakında GNU realpath), ancak o zamanlar GNU yardımcı programlarının bile yoktu readlink. Bu uygulama, sembolik bağlantı çözünürlüğünü önlemek veya boş sonlandırılmış çıktı üretmek realpathiçin birkaçını destekler options. BusyBox ayrıca kendi realpathkomutunu da içeriyor (bu seçenek yok).

GNU coreutils bir tanıtılan realpathkomutunu sürümü 8.15 Bu BusyBox en ve Debian en için uyumlu bir yerine geçer Ocak 2012'de realpath, hem de GNU ile ortak birçok seçenek vardır readlink.

realpathreadlink -fGNU ile aynı etkiye sahiptir readlink. İki komutu (veya daha doğrusu çeşitli realpathkomutları readlink -f) ayıran, destekledikleri ekstra seçeneklerdir.

GNU realpathonaylanmadı; tam tersi bir sorunu var: her yerde kullanılamayacak kadar yeni. Debian için kullanılan GNU ihmalrealpath onun gelen coreutilspaketi ve kendi ile sopa realpath. Nedenini bilmiyorum, çünkü GNU realpathbir servis dışı bırakma olmalı. Ancak Debian jessie ve Ubuntu 16.04'ten itibaren GNU realpathkullanılmıştır.

Linux sistemlerinde, şu anda, sembolik bağlar içerebilecek bir yolu kanonlaştırmak için en iyi bahis readlink -f.

BSD sistemlerinin GNU’dan readlinkfarklı yetenekleri olan bir komutu vardır readlink. Özellikle, BSD readlink, yolları kurallaştırmak için bir seçeneğe sahip değildir, yalnızca kendisine aktarılan sembolik bağlantıyı geçer.

readlinktesadüfen, aynı sorunu vardı - aynı zamanda birçok kez icat edildi (Unix'e sembolik bağlantılar eklendiğinde bu yararsızlığı ihmal edilebilir bir eksiklikti). Şimdi birçok uyumsuz bayrakla (özellikle BSD'ye karşı GNU) birçok uygulamada dengelendi.


8
readlink -fGNU’dan çok önce OpenBSD’deydi. Artık tüm NetBSD, FreeBSD ve OpenBSD'de var readlink -f( bağlantınız bundan bile söz ediyor). realpathUzun süredir FreeBSD ve IRIX’de (Debian’da onlardan önce olup olmadığını bilmiyorum). HPUX ve IRIX de readlinkolmasa da -f. realpathDebian deneysel paket şimdi (o şeyleri kırar olmadığını görmek için bir deneme olarak) coreutils gelen biridir. Dww , GNU bir realpathgibi readlink -eiken daha fazla davranır , readlink -fbu yüzden tam bir
düşme

2
realpathBundan önce 2002 yılından bu yana FreeBSD olmuştur, pwd(2000 yılından bu yana, bunu yapıyordu pwd some-fileçağırır realpath()üzerinde file). Debian bir etti realpathben OpenBSD her hangi bir ilave 1998'de bu IRIX 6.5 idi dışında hiçbir kanıt bulunamadı rağmen IRIX biri muhtemelen eskidir 1996 yılından bu yana paketi -fiçin readlink 1997 yılında . GNU readlink2003 yılında eklendi-f ve başından beri vardı .
Stéphane Chazelas

2
Mükemmel özet teşekkürler. Debian'ın GNU değişkenine geçme talebinin daha iyi bir hata olduğuna dikkat edin bugs.debian.org/730779 Mevcut realpath savunucusu bile değişimin gerçekleşmesini istiyor
Pádraig Brady

1
Müthiş cevap. Sadece RHEL'in uygulanmasına atıf yapılan referanslar realpath. readlink -fSürümünden bir şekilde farklı olup olmadığını bilen var mı ?
Felipe Leão

1
@ StéphaneChazelas Oh vay, cevaplarımda gerçekten çok fazla hata var. Onları işaret ettiğin için teşekkürler. Doğru bir cevap gönderebilir misiniz ve benimkini sileyim mi? (Aksi taktirde hataları düzeltirim, ancak uzun yapılacaklar listeme yapıştırmak daha fazla iş…)
Gilles

17

tl; dr readlink -f dönecektir 0oysa varolan dizinde varolmayan dosya için realpathgetiriler 1. Bununla birlikte, var olmayan bir dosya readlink -egibi davranacak realpathve geri dönecektir 1(sonunda Editörlerin notuna bakın).

readlink -f

$ readlink -f non-existent-file
/home/user/non-existent-file
$ echo $?
0

readlink -e

$ readlink -e non-existent-file
$ echo $?
1

realpath

$ realpath non-existent-file
non-existent-file: No such file or directory
$ echo $?
1

readlink -f var olmayan dizini olan

readlink -f davranış, yolun hangi bölümünün bulunmadığına bağlı olarak değişir.

$ readlink -f /tmp/non-existent-dir/foo
$ echo $?
1

kullanılabilirlik

readlinkçoğu Linux dağıtımında kurulur. Oysa, realpathgenellikle açıkça kurulmalıdır.

Özetle

Çağrıları değiştirmek istiyorsanız, realpath ...kullanın readlink -e ....


Ubuntu 16'da readlink (GNU coreutils) 8.21 ve realpath sürüm 1.19 ile test edilmiştir .

( Ed .: @AnthonyGeoghegan, " bu, Debian versiyonunu ifade eder realpath. GNU versiyonu realpathaynı şekilde davranırreadlink -f ").


3
Bu cevabı iptal ettim, ancak bunun Debian versiyonuna atıfta bulunduğunu açıklığa kavuşturmayı önerdim realpath. GNU versiyonu realpath, aynı şekilde davranır readlink -f.
Anthony G - Monica adaleti

2
Bunun MacOS Yüksek Sierra'da çalışmadığını onaylayabilir.
Pred
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.