web-dev-qa-db-ja.com

コマンドラインから実際にシンボリックリンクの場所にいるかどうかを確認するにはどうすればよいですか?

フォルダがあるとします:

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で「本当に」いることを知る方法はありますか?ありがとう

33
Oliver Williams

pwdコマンドの構成方法によっては、デフォルトでlogical作業ディレクトリ(pwd -L)は、シンボリックリンクの場所、またはphysical作業ディレクトリ(pwd -P)はシンボリックリンクを無視し、「実際の」ディレクトリを表示します。

あなたができる完全な情報のために

file "$(pwd -L)"

シンボリックリンクの中で、これは戻ります

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

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と同様に機能します。

17
Gowtham

あなたは本当に_/home/cpm135/public_html/class_にいます-それが「現在の作業ディレクトリは何ですか?」という質問に対する唯一の正しい答えです。

_/var/lib/class_を参照する場合、これは実際の場所ではなく、-そこに到達するために使用したパスについての詳細です。

_/bin/pwd_を実行すると、を調べて現在の作業ディレクトリを特定します。と..ディレクトリ(_ls -la_の上部にリストされているディレクトリ)は、..のどのディレクトリが。そして、..と。まで逆方向に作業します。同じディレクトリを参照してください。すべて完了すると、現在の作業ディレクトリがわかります。

pwd Shellビルトインを実行すると、この手順は実行されません(ただし、必要に応じて一部が実行される場合があります)。代わりに、ここに到達するために使用したパスが記憶されます。したがって、cdコマンドを実行するたびに、シェルは現在の場所を取得するためのパスの一部としてそのことを記憶し、pwdは、実行したすべてのcdコマンドに基づいて計算したものを出力します。実際の作業ディレクトリにします。

_ln -s . foo_を実行し、cdingをfooに保持すると、物事が本当に奇妙になる可能性があります-_/bin/pwd_は、まだ同じディレクトリにいると言いますが、シェルの組み込みpwdは、_/foo/foo/foo/foo/foo/foo_-そのようなディレクトリは実際には存在していませんが(とは言え、あなたはおそらくcancdに入れます。)

ディレクトリの名前が変更されている場合、混乱のもう1つの原因があります。 _/bin/pwd_は変更をすぐに反映しますが、組み込みのpwdは、古いディレクトリ名が重要ではないことを伝える何かを行うまでは機能しません。

3
dougmc

基本的に、現在の作業ディレクトリの実際のパスを表示するかどうかを尋ねています。まあ、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()は、シンボリックリンクのパスではなく、ディレクトリの実際のパスを解決します。

1