~ / Belgeler `göreceli veya mutlak bir yol mu?


37

Bu sadece bir kelime sorusudur, fakat kafamın içinde dolanıp durup duruyor.

LPIC hazırlık kitabındaki bir uygulama sınavından gelir . Kitaba göre doğru cevap ~/Documents, göreceli bir dizindir, çünkü giriş dizinine göredir.

Ancak, bu kitap onurlu bir yazım hatası ve hata oranı içeriyor, bu yüzden orada yazılı olan her şeyi kabul edemem. Burada kabul etmiyorum çünkü benim ~için kabuk tarafından değişken içeriğine $HOMEya da mevcut kullanıcı ana dizin yoluna (cf. man bash) genişletilmiş bir değişken olarak davranır , bu nedenle asıl yol /home/myuser/Documentsaslında mutlak bir dizindir.

Bir zamanlar Wikipedia bile bu konuda bana yardımcı olmuyor gibi görünüyor (bu konuda kitabın yanlış olduğunu doğrulasa bile):

Mutlak veya tam yol, geçerli çalışma dizininden bağımsız olarak bir dosya sisteminde aynı konuma işaret eder. Bunu yapmak için kök dizini içermesi gerekir.

Buna karşılık, göreceli bir yol verilen bazı çalışma dizinlerinden başlayarak tam mutlak yolu sağlama gereksinimini önler.

Burada yine aynı fikirde değilim: Bu tanımlamaya göre /opt/kde3/bin/../lib, geçerli çalışma dizinine bağlı olmayan yol mutlak bir yol olmalı, ancak bu konudaki mevcut anlayışım kitabın yazarını bu yolu göreceli yapanla eşleştiriyor.

Webster Sözlüğü'ne göre hızlı bir web araması sadece hayal kırıklığımı arttırıyor :

mutlak yol - Kök dizine göre bir yol. İlk karakteri yol adı ayırıcı olmalıdır.

Yani $HOME/Documents, ya da sadece $HOMEmutlak dizinler olarak kabul edilmeyecek? Yoksa bu tanım değişken genişleme anlamına mı geliyor? Peki ya kabuğun ~karakteri? Bir yerde bulabileceğim mutlak dizine karşı göreceli ve güvenilir bir tanımı var mı ve yanlış mıyım?


7
Tüm yollar görecelidir, bazıları sadece kök dizine /ve bizim mutlak dediğimiz şeylere bağlıdır. Böylece başlar her şeyin ne /ben (bu bile mutlak çağırır /usr/../etc) ve her şey ben çağırır nispi ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). Mesele şu ki, mutlak çalışma dizini veya mevcut kullanıcı ne olursa olsun çalışmalı. Göreceli yalnızca belirli bazı dar durumlarda çalışabilir.
jimmij

6
Yol, kullanıcının kim olduğuna bağlı olarak farklı bir konuma genişleyebilir. Bunu söyledikten sonra, bence bu hala mutlak bir yol, göreceli bir yol değil. Yine de mutlak ve göreceli yol tanımlarının tam olarak tanımlandığını sanmıyorum. Bu matematik değil. Bu soru gerçekten anlayışı test etmiyor, imo ve anlamsız.
Faheem Mitha

1
@FaheemMitha: LPIC , dağıtım amaçlı bir Linux sertifikasıdır. Sertifikasyonun kendisi iyi görünüyor, ancak bu, bu sınava hazırlamak için satılan (en azından bazı) kitapların kendi kendine çalışma olarak hazırlanmasından çok uzak ...
WhiteWinterWolf

2
@jimmij: "göreceli", yollar bağlamında belirli bir teknik anlama sahip ve kelimenin farklı bir İngilizce dili anlamını kullanmak kötü bir uygulamadır. ~/fooGöreceli bir yol arama konusunda tamamen aynı fikirde değilim . Alacağınız şey, kodlama ve parametreleştirme arasındaki farktır. Daha fazla ayrıntı için cevabımı gör.
Peter Cordes,

1
Webster Sözlüğü'nün tanımları doğru, ama çok kafa karıştırıcı. Bununla birlikte, örneğin dizeleri ima ~/Documentsve $HOME/Documentsyollar değildir. Genişlemeden sonra (mutlak) yolları belirlerler, ancak kendileri yollar değildir. Bence bu, kaç tane Unix / Linux kullanıcısının bu terimi kullandığı konusunda hemfikirdir, ancak şüphesiz bu dizelere kendileri de yol denir.
reinierpost

Yanıtlar:


41

Yazar bir yol olarak bu değişmez dizgiden (kabuk genişlemesi olmadan) bahsederek sizi yakalamaya çalışıyorsa, göreceli bir yoldur ( mkdir -p './~/Documents'). Aksi takdirde:


Bu mutlak bir yol , çünkü çözümlemek işlemin geçerli çalışma dizinine bağlı değil. Göreceli yol her zaman işlemin çalışma dizinine göre anlamına gelir. Veya sembolik bağlantı hedeflerinde, sembolik bağının konumuna göre. ( gcc -> gcc-5.2vs. gcc -> /usr/bin/gcc-5.2) Bu, NFS bağları ve aynı bağlantıya farklı mutlak yollar yoluyla ulaşabileceğiniz diğer durumlar için önemlidir. Örneğin

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Debian bazen ../../doc/whatever/whateverkesin bir sembolik bağlantı hedefi yerine sembolik bağlantılar kurar, bu nedenle NFS başka bir yere monte edildiğinde veya bir chrootun chroot(8)içine girmeden bakıldığında çalışır.

Her Unix işleminin kendi cwd'si vardır. pwdKomut sadece yazdırmak için var.

POSIX sistem çağrıları ile dizin değiştirme hakkında daha fazla bilgi için bkz. http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html .


Herkesin söylediği gibi, ~yol herhangi bir şey için kullanılmadan önce kabuk tarafından genişletilir. ~/bin/myprogBir kabuk komut dosyasında kullanmak , farklı kullanıcılar için farklı çalışmasını sağlar. Arasındaki fark ~/bin/foove /home/peter/bin/foobunlardan biri daha bunu parametreli ederken, yerini sert kodlu olmasıdır. ~Sürümü göreceli bir yol olarak adlandırmak bir hatadır (IMO) .

“Bir çevre değişkenine göre” olan şeyler hakkında konuşmak kafa karıştırıcıdır. Bunları kullandığınız bağlamda belirli teknik anlamları olan farklı İngilizce dillerinin anlamlarını kullanmak kötü bir uygulamadır.

Bir kırık sistemde, ile HOME=a/relative/path, ~/foogöreli bir yol genişletecektir. Bu hiçbir şekilde kullanışlı bir kurulum olmaz.


3
Bu cevap için teşekkür ederim, benim için en kapsamlı gibi görünüyor. Ayrıca yazarın kanonik yol kavramını yanlış bir şekilde karıştırdığı izlenimini edindim (yazarın hiçbir yerde söz etmediği). /opt/kde3/bin/../libÖrneğin yanlış göreceli yol olarak sınıflandırılır: o olduğunu mutlak bir yol ama değil kurallı bir. Dediğiniz gibi, bu sadece her şeyi kafa karıştırıcı kılıyor, açıklamanız ve NFS ile ilgili bilgi için teşekkürler :)!
WhiteWinterWolf

1
Bir sınava hazırlık kitabı yazmanın çok eğlenceli olmadığı ve günlük hesaplamaları için yalnızca Unix veya GNU / Linux kullananların bu kitapları yazanların olmadığı sonucuna varmak zorundayım. Kanonik olmayan bir yol akrabası çağırma örneği benim için çok kötü ve açık görünüyor. man7.org/linux/man-pages/man3/realpath.3.html (ve realpath(1)) her ikisini de yapın: kanonikleştirin ve mutlak olun (aynı zamanda sembolik izleri takip edin), bu yüzden muhtemelen bazı karışıklıklar oraya girdi.
Peter Cordes,

2
Yine de, bunlar benim için sıradan gündelik kavramlardır. Onları tanıdığımı söyleyen bir kağıda sahip olmanın garip olacağını düşünüyorum ... Ama kağıdınıza bakmak isteyen herkese, beyazWinterWolf yazarken iyi şanslar. :)
Peter Cordes,

48

Bu aslında terimlerin tanımı hakkında bir sorudur. Bu nedenle, amaçlarınız için cevap, LPIC'in istediği şeydir. Ancak teknik gerçeklere dayanarak bazı sonuçlara varabiliriz:

'~/Documents'Bir sistem çağrısına geçtiyseniz ~, geçerli dizinde tam olarak adlandırılmış bir dizin arar (ve muhtemelen başarısız olur). Yani, çekirdeğin kullandığı yol adları kavramıyla , bu göreceli bir yoldur - ama kastettiğimiz bu değil.

~kabuğun (ve kolaylık olması için onu taklit eden diğer programların) gerçek bir yol adıyla genişlettiği sözdizimidir . Göstermek için ~/Documents, yaklaşık olarak aynı şeydir $HOME/Documents(yine, kabuk sözdizimi). Yana $HOMEmutlak yolu olmalıdır, değeri $HOME/Documents bir yol da, bir. Ancak metin $HOME/Documentsveya ~/Documentskastettiğimiz yol olabilmek için kabuk tarafından genişletilmesi gerekiyor.

Ben hassas ve tutarlı olduğu istediği Böylece eğer Söyleyebilirm ~/Documentsolan mutlak bir yol genişler kabuk senaryonun bir parçası.


Tabii ki, çekirdeğin ne $HOMEanlama geldiği hakkında hiçbir fikri olmaz, tıpkı ne anlama geldiği hakkında hiçbir fikri yoktur ~. Bununla birlikte, genleşmenin şüpheli olması için kabuğun yaptığı; çoğu uygulama bunu destekler, bu kabuktan ziyade C kütüphanesine işaret eder. Ortam değişkeni genişleme ancak bir kabuğun bir özelliği; ~/somefile.odtLibreOffice'de açabilirsiniz ancak $HOME/somefile.odtLibreOffice $ HOME'un uygun şekilde ayarlandığı bir kabuktan başlatılsa bile.
CVn

5
Sen bunu istediğiniz şüpheli olarak bulunmaktadır, ancak oluyor belgelenmiş ve C onaylayın veya çürütmek için kolay olmalıdır
Yararsız

6
Diğer programlar ~kabuğun taklitinde sözdizimi uyguluyor , çünkü kullanışlı bir kısayol. Aslında, genişletme işlemini yapan bir kütüphane işlevi olup olmadığını bilmiyorum, ancak bu kesinlikle yol adını kullanmaktan ayrı olarak yapılmış bir şey.
Kevin Reid

2
globve wordexpdiğer şeylerin arasında genişleme yapmak.
o11c

2
@ MichaelKjörling: Birkaç program ~genişleme uygular ; çoğu değil. Örneğin, yazarsanız ls -l ~, lsprogram hiçbir zaman ~karakteri görmez ; lsçağrılmadan önce kabuk tarafından genişletilir . Aslında bir geçerseniz ~için ls, onu özel olarak tedavi etmez; deneyin ls -l '~(kelimenin tam anlamıyla adlı bir dosya listelemek için çalışacağız hangi `' ~).
Keith Thompson,

16

Senin Eğer $HOMEis /home/white/, ~/Documents(aynı şekilde $HOME/Documents) kabuk tarafından genişletilir (bkz buraya kadar bir açıklama) /home/white/Documentsbir olduğunu, mutlak yolu.

Göreceli bir yol /, gibi bir (kabuk genişlemesinden sonra) ile başlamayan yoldur, ../Documentsveyafoo/bar

Bazı eski kabuklar genişlemez ~(yol bash, tcsh, zshvb ... do); ~/Documentsile başlayan göreceli bir yol olarak göreceklerdi ~; ancak genellikle gibi dizin adınız yoktur ~(ancak önermediğim bir tane oluşturabilirsiniz mkdir '~').


Hangi mermilerin genişlemediğini belirtmelisiniz~
Edward Torvalds 12:15

3

Bir mutlak yol ile başlar /(sabitlendiği ne ifade eder), bir göreceli yol başlar mevcut dizinde (ve geçerli dizin değiştikçe değişiklikleri ifade eder ne öylesine). Çoğu kabukları kullanmak ~yani geçerli kullanıcı, ev dizininin tam yolu için bir kısaltma olarak başında ~/Documentsdizindir Documentsbakılmaksızın geçerli dizin ne olabileceğini, geçerli kullanıcının evinde. Bu yüzden mutlak bir yol.


1

Yol, kullanıcının kim olduğuna bağlı olarak farklı bir konuma genişleyebilir. Bunu söyledikten sonra, bence bu hala mutlak bir yol, göreceli bir yol değil. Ancak, mutlak ve göreceli yol tanımlarının tam olarak tanımlandığını sanmıyorum. Bu matematik değil. Bu soru bana göre anlayışı test etmiyor ve bence anlamsız.


Tanım, düşünceden çok daha fazla. Vikipedi, sadece Unix için değil, genel dava için de büyük bir tavır aldı: en.wikipedia.org/wiki/…
Peter Cordes

1

Başında ~ / kullanımı, yolu kesinleştirir çünkü herhangi bir tanım ile belgeleri bulabilmeniz şu anda bulunduğunuz yere bağlı değildir. Ancak genişleme çekirdek tarafından değil kabuk tarafından yapılır, bu nedenle bu sözdizimini tanımayan bir kabuk kullanıyorsanız (/ bin / sh gibi, orijinal Bourne kabuğu, bash takma adı değil), şans.

İlginçtir, ~ / yerine ~ / / kullanırsanız, $ HOME okuma optimizasyonu genellikle geçerli olmaz ve / etc / passwd doğruysa her zaman mutlak bir çözüme ulaşır.


-1

Kitap, mutlak bir yolun a ile başlayan herhangi /bir yol olduğu ve göreceli bir yolun başka herhangi bir şey olduğu görüşü gibi görünüyor.

Benzer tipteki simgeleri görebilir ..ve kullanabilirsiniz $HOME. Her ikisi de, bir yol bileşeni için, yol mutlak bir yola çözülmeden önce değiştirilmelidir.


3
Nasıl bir ..şey $HOME? ..doğrudan sistem çağrısına geçirilen bir yolun başlangıcında olabilir, kabuk genişletmeye gerek yoktur. Böyle bir yol mutlak bir yol değildir ; hala süreç cwd veya sembolik bağlantı konumuna göredir. Yazar, bir değişmez diziden (kabuk genişlemesi olmadan) bir yol olarak bahsederek sizi yakalamaya çalışıyorsa. Kitap için mazeret yaratmaya çalıştığınızı düşünüyorum, ancak bunun yanlış olduğunu söylemeye meyilliyim ve işlerin karışmasına izin vermedim.
Peter Cordes,
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.