フォルダがあるとします:
cd /home/cpm135/public_html
シンボリックリンクを作る
ln -s /var/lib/class .
後で、私はそのディレクトリにいます:
cd /home/cpm135/public_html/class
pwd
は/home/cpm135/public_html/class
にいることを教えてくれます
私が/var/lib/class
で「本当に」いることを知る方法はありますか?ありがとう
pwd
コマンドの構成方法によっては、デフォルトでlogical作業ディレクトリ(pwd -L
)は、シンボリックリンクの場所、またはphysical作業ディレクトリ(pwd -P
)はシンボリックリンクを無視し、「実際の」ディレクトリを表示します。
あなたができる完全な情報のために
file "$(pwd -L)"
シンボリックリンクの中で、これは戻ります
/path/of/symlink: symbolic link to /path/of/real/directory
pwd
は実際には組み込みのシェルであることに注意してください。シェルとその構成によっては、結果が変わる場合があります。よりポータブルなソリューションについては、/bin/pwd
を使用する必要があります。マニュアルページのスニペット:
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.
一般に、readlink -f
を使用して、ファイル/ディレクトリの完全な正規パスを解決できます。 readlink -f .
はpwd -P
と同様に機能します。
あなたは本当に_/home/cpm135/public_html/class
_にいます-それが「現在の作業ディレクトリは何ですか?」という質問に対する唯一の正しい答えです。
_/var/lib/class
_を参照する場合、これは実際の場所ではなく、-そこに到達するために使用したパスについての詳細です。
_/bin/pwd
_を実行すると、を調べて現在の作業ディレクトリを特定します。と..ディレクトリ(_ls -la
_の上部にリストされているディレクトリ)は、..のどのディレクトリが。そして、..と。まで逆方向に作業します。同じディレクトリを参照してください。すべて完了すると、現在の作業ディレクトリがわかります。
pwd
Shellビルトインを実行すると、この手順は実行されません(ただし、必要に応じて一部が実行される場合があります)。代わりに、ここに到達するために使用したパスが記憶されます。したがって、cd
コマンドを実行するたびに、シェルは現在の場所を取得するためのパスの一部としてそのことを記憶し、pwd
は、実行したすべてのcd
コマンドに基づいて計算したものを出力します。実際の作業ディレクトリにします。
_ln -s . foo
_を実行し、cd
ingをfooに保持すると、物事が本当に奇妙になる可能性があります-_/bin/pwd
_は、まだ同じディレクトリにいると言いますが、シェルの組み込みpwd
は、_/foo/foo/foo/foo/foo/foo
_-そのようなディレクトリは実際には存在していませんが(とは言え、あなたはおそらくcancd
に入れます。)
ディレクトリの名前が変更されている場合、混乱のもう1つの原因があります。 _/bin/pwd
_は変更をすぐに反映しますが、組み込みのpwd
は、古いディレクトリ名が重要ではないことを伝える何かを行うまでは機能しません。
基本的に、現在の作業ディレクトリの実際のパスを表示するかどうかを尋ねています。まあ、pythonとos.getcwd()
関数があります
以下に表示されているのは、私のホームディレクトリにある「VirtualBox VMs」ディレクトリ内の小さなテストです。実際には、_/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
_
ご覧のとおり、pythonのos.getcwd()
は、シンボリックリンクのパスではなく、ディレクトリの実際のパスを解決します。