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?
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:
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.
/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.
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.
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):
getcwd).Daha sonra, bir cd, pushdveya yaptığınızda popd, kabuk , dize düzenleme işlevlerini kullanarak çalışma dizinini izler . Örneğin,
/home/simve siz yazıyorsanız cd .., kabuk çalışma dizininizin olduğunu hesaplar /home./home/simve siz yazıyorsanız cd ., kabuk çalışma dizininizin hala olduğunu hesaplar /home/sim./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.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.
-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