Geçerli dizine bir symlink ekledim ln -s . aa
. Eğer yürütürsem cd aa
ve bundan sonra yürütürsem pwd
, cevap olur /home/sim/aa
.
Ama ben yürütürsem /bin/pwd
yazdı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 aa
ve bundan sonra yürütürsem pwd
, cevap olur /home/sim/aa
.
Ama ben yürütürsem /bin/pwd
yazdırır /home/sim
(geçerli dizin değişmedi).
Bu fark nereden geliyor?
Yanıtlar:
Bash dahil çoğu kabukta pwd
bir kabuk yerleşiktir:
$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd
Kullanıyorsanız /bin/pwd
, -L
yerleş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/pwd
sembolik 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 pwd
olması dışında varsayılan olarak sembolik içeren -P
seçeneği kullanılır, ya da -o physical
set 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/pwd
Symlink'i varsayılan olarak yok sayar, info pwd
cevabı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, pwd
kullanımıdır -P
Eğer yoksa, varsayılan olarak bir seçenek, -L
seçenek, nasıl yol sembolik içeren yazdırırım? https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
Ne 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 pwd
programı ve getcwd
kü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
, pushd
veya yaptığınızda popd
, kabuk , dize düzenleme işlevlerini kullanarak çalışma dizinini izler . Örneğin,
/home/sim
ve siz yazıyorsanız cd ..
, kabuk çalışma dizininizin olduğunu hesaplar /home
./home/sim
ve siz yazıyorsanız cd .
, kabuk çalışma dizininizin hala olduğunu hesaplar /home/sim
./home/sim
ve siz yazıyorsanız cd aa
, kabuk , sembolik bir bağlantı /home/sim/aa
olup 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/pwd
Program 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/sim
ve/home/sim/aa
#
tüm gerçek dizinleri (değil sembolik bağlantılar) bulunmaktadır.
pwd #
Çıktı:/home/sim/aa
doğru olan.
mv ../aa ../bb
pwd #
Çıktı:/home/sim/aa
yanlış olan.
/bin/pwd #
Çıktı:/home/sim/bb
doğru olan.
Ve bu konuda net olmamanız durumunda, ln -s . aa
ve 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