Pwd ve / bin / pwd arasındaki garip fark


15

Geçerli dizine bir symlink ekledim ln -s . aa. Eğer yürütürsem cd aave bundan sonra yürütürsem pwd, cevap olur /home/sim/aa.

Ama ben yürütürsem /bin/pwdyazdırır /home/sim(geçerli dizin değişmedi).

Bu fark nereden geliyor?

Yanıtlar:


17

Bash dahil çoğu kabukta pwdbir kabuk yerleşiktir:

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

Kullanıyorsanız /bin/pwd, -Lyerleşik ile aynı sonucu almak için seçeneği kullanmanız gerekir pwd:

$ ln -s . test
$ cd test && pwd
/home/cuonglm/test
$ /bin/pwd
/home/cuonglm
$ /bin/pwd -L
/home/cuonglm/test

Varsayılan olarak, /bin/pwdsembolik bağlantıları yoksayar ve gerçek dizini yazdırır.

Gönderen info pwd:

`-L'
`--logical'
     If the contents of the environment variable `PWD' provide an
     absolute name of the current directory with no `.' or `..'
     components, but possibly with symbolic links, then output those
     contents.  Otherwise, fall back to default `-P' handling.

`-P'
`--physical'
     Print a fully resolved name for the current directory.  That is,
     all components of the printed name will be actual directory
     names--none will be symbolic links.

Yerleşik pwdolması dışında varsayılan olarak sembolik içeren -Pseçeneği kullanılır, ya da -o physicalset yerleşik etkindir.

Gönderen man bash:

pwd [-LP]
              Print the absolute pathname of the  current  working  directory.
              The pathname printed contains no symbolic links if the -P option
              is supplied or the -o physical option to the set builtin command
              is  enabled.  If the -L option is used, the pathname printed may
              contain symbolic links.  The return status is 0 unless an  error
              occurs  while  reading  the  name of the current directory or an
              invalid option is supplied.

Bu farklılıkların nereden geldiğini anlayamıyorum
user3581976

/bin/pwdSymlink'i varsayılan olarak yok sayar, info pwdcevabımın bir kısmını okuyun : Geçerli dizin için tamamen çözülmüş bir ad yazdırın. Yani, yazdırılan adın tüm bileşenleri gerçek dizin adları olacaktır - hiçbiri sembolik bağlantı olmayacaktır.
cuonglm

@ user3581976: Daha net bir şekilde güncellememe bakın.
cuonglm

Varsayılan olarak ayarlanmış olmasına rağmen neden pwd için -L komutu var? Ve kabuk pwd'yi çalıştırmak için / bin / pwd komutunu kullanmıyor mu?
user3581976

2
@ user3581976: Eğer ile kabuk başladığını Görüntü set -o physicalşimdi, pwdkullanımıdır -PEğer yoksa, varsayılan olarak bir seçenek, -Lseçenek, nasıl yol sembolik içeren yazdırırım? https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.htmlNe yaptığını bilmek için bunu okuyun set -o physical.
cuonglm

7

Bir işlemin, bu sorunun cevabı olarak konuyla ilgili olamayacak kadar karmaşık bir yöntem kullanarak, dosya sistemini geçerli çalışma dizinini belirlemesi için sorgulaması mümkündür. Bu nedir pwdprogramı ve getcwdkütüphane işlevi yok. Unix'in ilk günlerinde, çalışma dizininizin ne olduğunu öğrenmenin tek yolu bunlardı. Sorunuzun cevabının, diğer cevapların hiçbirinde bulamadığım ve hatta bu sitede başka bir yerde bulamadığım kısmı (42 saniyelik aramadan sonra):

  • Kabuk başladığında, geçerli çalışma dizinini alır (büyük olasılıkla arayarak getcwd).
  • Daha sonra, bir cd, pushdveya yaptığınızda popd, kabuk , dize düzenleme işlevlerini kullanarak çalışma dizinini izler . Örneğin,

    • Çalışma dizininiz /home/simve siz yazıyorsanız cd .., kabuk çalışma dizininizin olduğunu hesaplar /home.
    • Çalışma dizininiz /home/simve siz yazıyorsanız cd ., kabuk çalışma dizininizin hala olduğunu hesaplar /home/sim.
    • Çalışma dizininiz /home/simve siz yazıyorsanız cd aa, kabuk , sembolik bir bağlantı /home/sim/aaolup olmadığını kontrol etmeden çalışma dizininizin olduğunu hesaplar aa.

    Bunu, arama “maliyetini” kaydetmek için yapar getcwd. Ancak bu yanlış bir bilgi ile sonuçlanabileceğinden bir ödünleşmedir.

  • pwd(Yerleşik) komutu basitçe çalışma dizini ne olduğu Shell'in hatırlanan / bilgisayarlı kavramını gösterir.
  • Ayrıca, kabuk kullanıcı işlemlerinin rahatlığı için çalışma dizininin ne olduğunu hatırladığı / hesapladığı fikrini PWD ortam değişkenine koyar . Bir süreç doğru bilgi istiyorsa asla buna güvenmemelidir.

Sonuç olarak, kabuğun nerede olduğu konusunda kafası karışabilir. Ancak, yazarsanız /bin/pwd, kabuğun çalışma dizininin ne olduğu fikrine erişimi olmayan ayrı bir işlemde çalışır ve böylece eski çalışma yolu olan gerçek çalışma dizininin kendisini belirler. (İstisna: /bin/pwdProgram edebilirsiniz PWD ortam değişkeni bakmak ve görünüşe göre belirttiğiniz ne zaman -L.) Burada kabuk karıştı nasıl başka bir örnek:

cd /home/sim/aa # Varsayalım ki /home, /home/simve /home/sim/aa
# tüm gerçek dizinleri (değil sembolik bağlantılar) bulunmaktadır.
pwd # Çıktı: /home/sim/aadoğru olan.
mv ../aa ../bb
pwd # Çıktı: /home/sim/aayanlış olan.
/bin/pwd # Çıktı: /home/sim/bbdoğru olan.


Ve bu konuda net olmamanız durumunda, ln -s . aave yazarsanız cd aa, geçerli çalışma dizininiz , yazarken olduğundan daha fazla değişmedicd . - çünkü, yazarken yaptığınız şey budur cd aa.


Teşekkürler, çok iyi bir cevap, bu beklediğim
şeydi

2
Bu cevap biraz bükülmüş görünüyor . Maliyetten tasarruf-L etmekten daha fazlası var - ve kullanıcı tanımlı POSIX tarafından belirlenmiş bir ortam değişkeni - kullanıcı alanı uygulamaları muhtemelen buna güvenmelidir (ne anlama geliyorsa ...?) . Her neyse, bir sembolik hayranı olmasam da, kullanıcının seçmesi gerektiği kadar çılgın yönlerde dolaylı olarak kullanılması ayrıcalıktır - ve her şeyden daha fazlası budur. $PWD -L
12'de mikeserv

1
Bu kabul edilmiş cevap olmalıdır (sembolik bağlar sorunun konusu değildir).
Thomas Dickey
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.