Aslında komut satırından sembolik bir konumda olup olmadığımı nasıl anlarım?


33

Bir klasörüm olduğunu varsayalım:

cd /home/cpm135/public_html

ve sembolik bir bağlantı kurun

ln -s /var/lib/class .

Daha sonra bu dizindeyim:

cd /home/cpm135/public_html/class

pwdBen varım söyle gidiyor/home/cpm135/public_html/class

İçinde "gerçekten" olduğumu bilmenin bir yolu var mı /var/lib/class? Teşekkürler



1
Bazı kabuklar aslında bir sembolik bağlantı içinde olmanıza izin vermez. Örneğin, fishkabuk siz cdgirdiğinizde sembolik bağlantıyı otomatik olarak çözer .
trysis,

Yanıtlar:


56

pwdKomutunuzun nasıl yapılandırıldığına bağlı olarak , bağlantı sembolünü görecek mantıksal çalışma dizinini (çıkış tarafından pwd -L) veya sembolik bağlantıyı yok sayan ve "gerçek" dizini gösteren fiziksel çalışma klasörünü (çıkış tarafından pwd -P) göstermek varsayılan olarak kullanılabilir .

Tam bilgi için yapabilecekleriniz

file "$(pwd -L)"

Bir sembolik bağlantı içinde bu geri dönecektir

/path/of/symlink: symbolic link to /path/of/real/directory

1
evet, -Pbayrak ihtiyacım olan şeydi. Teşekkürler
Oliver Williams

6
Ayrıca başlık, sadece kullanımda soruya cevap vermek için test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(veya değiştirin && echo No symlinksile || echo Symlinks).
CVn

1
Bu, ekoya gerek duymadan soruyu mükemmel bir şekilde yanıtlar. Eğer soru 'Eğer
sembolize edilmiş bir dizindeysem

file "$(pwd)"sadece, link linki son dizin bileşeni ise işe yarar. CD’ye gönderildiğinde OP’nin sembolik bağlantısını algılamaz /home/cpm135/public_html/class/foo/bar. Bir yol adındaki tüm sembolik bağlantılar için bilgi basan hiçbir şey bilmiyorum, ama aynı zamanda realpath .eşdeğer olduğunu düşündüğüm gibi de kullanabilirsinizpwd -P
Peter Cordes

17

Bunun pwdaslında yerleşik bir kabuk olduğunu unutmayın . Kabuğunuza ve konfigürasyonuna bağlı olarak, sonuçlar değişebilir. Daha taşınabilir bir çözüm için kullanmanız gerekir /bin/pwd. Manuel sayfadaki kod parçası:

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

Genel olarak, kullanarak herhangi bir dosyanın / dizinin kurallı yolunu çözebilirsiniz readlink -f. readlink -f .benzer işler pwd -P.


2
Her ne kadar readlink -f
Unices'da

3

Gerçekten içindesiniz /home/cpm135/public_html/class- "şu andaki çalışma dizinim nedir" sorusunun tek doğru cevabı bu.

Bahsettiğinizde /var/lib/class... bu gerçekten nerede olduğunuzla ilgili değil, oraya hangi yolu kullandığınızla ilgili .

Çalıştığınızda /bin/pwdmevcut çalışma dizininize bakarak hesaplar. ve .. dizinleri (başında listelenenler ls -la), hangi dizinde eşleşeceğini bulmak. ve ardından geriye ve geriye doğru çalışıp .. ve. aynı dizine bakın. Tüm bunları yaptıktan sonra, geçerli çalışma dizininizin ne olduğunu bilir.

pwdKabuğu yerleşik olarak çalıştırdığınızda, bu prosedürü izlemiyor (gerekirse bazılarını da yapabiliyor olmasına rağmen) - bunun yerine, buraya gelmek için attığınız yolu hatırlıyor. Bu nedenle, her cdkomut yaptığınızda, kabuğunuz, bulunduğunuz yere gitme yolunun bir parçası olarak hatırlar ve pwdyaptığınız tüm cdkomutlara göre hesapladıklarını yazdırır ; çalışma dizini.

Siz bir şey yapıp foo içine girmeye ln -s . foodevam ettiğinizde işler gerçekten garipleşebilir cd- /bin/pwdhala aynı dizinde olduğunuzu söyleyeceksiniz, ancak kabuk yerleşikpwd olduğunuzu söyleyecektir içinde olduğunuzu söyleyecektir /foo/foo/foo/foo/foo/foo- böyle bir dizin olmasa bile. (Yani - muhtemelen can cd içine.)

Buradaki başka bir karmaşa kaynağı, dizinlerin yeniden adlandırılıp değiştirilmediğidir. /bin/pwdsonra hemen değişikliği anlayacaktır, ancak yerleşik pwd, eski dizin adının önemli olmadığını söyleyen bir şey yapana kadar yapmaz.


1
Soruyu cevaplamıyorsun, reddediyorsun.
Dmitry Grigoryev

4
Bu soruya doğrudan cevap vermese de , kabuğun pwdyerleşik yapısı arasındaki farkı anlamak ve /bin/pwdbağımsız sürümün nasıl daha yararlı bilgiler sağladığını açıklamak için yararlı bir yazı olduğunu düşünüyorum (asıl soruya cevap verebilir).
Anthony G - Monica

1
Bu farklılıkların tümü diğer cevapların bahsettiği -Pve -Lseçeneklerine bağlı. Kısacası, bazı uygulamalar varsayılanı, bazıları diğerini oluşturuyor. Centos sisteminde, teslim etmem gereken bash'in mantığı /bin/pwdvarsayılan ve fiziksel olarak varsayılandır, ancak her ikisi de komut satırı seçeneklerini kabul eder ve verildiğinde sonuç üzerinde hemfikirdir.
IMSoP

1
Soru yanlış öncüllere dayanıyor - '/ var / lib / class'ta "gerçekten" olduğumu bilmenin bir yolu var mı?' Bu, bunun ne anlama geldiğini açıklayarak, onun gerçekte ne aradığını anlamasına yardımcı olur.
Pwd

1
Argümanını geriye doğru aldın. ls ..içeriği gösterilir /var/lib, değil /home/cpm135/public_html. cd ..özel: kabuk “oraya nasıl ulaştığınızı” özel olarak takip ediyor ve aslında bir chdir("..")sistem çağrısı yapmıyor . Çekirdek söz konusu olduğunda, kabuğunuzun geçerli çalışma dizini ( /proc/self/cwd) yalnızca bir bağlantı noktasıdır: inode pair. Dizindeki açık bir dosya tanıtıcısı gibi, bu nedenle dizini yeniden adlandırmak kabuğunuzu kırmıyor. ( cd .kabuğun $PWDdeğişkenini güncellemek için ). Faydalı bir noktaya değiniyorsunuz, bu yüzden düzelttiğinde bunu güçlendiririm
Peter Cordes

1

Esas olarak mevcut çalışma dizininin asıl yolunu gösterip göstermeyeceğinizi soruyorsunuz. Peki, python ve os.getcwd()fonksiyonu var.

Aşağıda gördüğünüz, ana dizinde bulunan "VirtualBox VMs" dizini içindeki küçük bir test. Gerçekte, üzerine monte edilmiş, farklı bir sabit sürücüde bulunan farklı bir dizine bir bağlantıdır /mnt/HDD.

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

Gördüğünüz gibi python's os.getcwd(), dizinin link yolunu değil gerçek yolunu çözer.

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.