コマンドラインから実際にシンボリックリンクの場所にいるかどうかを知る方法は?


33

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

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か?ありがとう



1
一部のシェルでは、実際にシンボリックリンク内にいることはできません。たとえば、fishシェルは、シンボリックリンクを自動的に解決しますcd
トリシス16

回答:


56

pwdコマンドの設定方法に応じて、デフォルトでは、シンボリックリンクの場所を示す論理作業ディレクトリ(による出力pwd -L)、またはシンボリックリンクを無視して「実際の」ディレクトリを示す物理作業ディレクトリ(による出力pwd -P)が表示されます。

あなたができる完全な情報について

file "$(pwd -L)"

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

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

1
はい、-Pフラグは私が必要なものでした。ありがとう
オリバーウィリアムズ

6
また、タイトルに質問に答えるために、ちょうど使用test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(または交換&& echo No symlinks|| echo Symlinks)。
CVn

1
これは、エコーする必要なく、質問に完全に答えます。?質問は、私はシンボリックリンクのディレクトリにいる場合、私は、メッセージを表示するにはどうすればよい」だった場合は、」その後、必要とされるであろうエコー。
Arronical

file "$(pwd)"シンボリックリンクが最後のディレクトリコンポーネントである場合にのみ機能します。にCDされ/home/cpm135/public_html/class/foo/barたときにOPのシンボリックリンクを検出しません。私は、パス名にすべてのシンボリックリンクのための情報を印刷し何を認識していないんだけど、あなたはまた、使用することができrealpath .、私はと等価であると考えています、pwd -P
ピーター・コルド

17

これ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 -freadlink -f .と同様に動作しpwd -Pます。


2
私はreadlink -fすべてのUnicesで利用できない難しい方法を学びました(たとえば、OS-Xでは利用できません)
16

3

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

を参照するとき /var/lib/class...と、それは実際にあなたがどこにいるかではなく、そこに到達するために使用したパスについての詳細です

走るとき /bin/pwd、それは。および..ディレクトリー(の上部にリストされているものls -la)。そして..と。同じディレクトリを参照します。それがすべて完了すると、現在の作業ディレクトリが何であるかがわかります。

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

aを実行してfoo ln -s . fooを続けるcdと、事態は本当に奇妙になる可能性があります- /bin/pwdまだ同じディレクトリにいるpwdと言いますが、シェルビルトインは/foo/foo/foo/foo/foo/foo、そのようなディレクトリが実際に存在していなくても、あなたがいると言います。(それは言った-あなたはおそらくできる cdそれにに入ること。)

別の混乱の原因は、ディレクトリの名前が変更された場合です。 /bin/pwdするとすぐに変更が反映されますが、ビルトインpwdは、古いディレクトリ名が問題ではないことを伝える何かを実行するまで動作しません。


1
あなたは質問に答えていません、あなたはそれを却下しています。
ドミトリーグリゴリエフ

4
これは質問に直接答えませんが、シェルのpwd組み込みの違いを理解し、/bin/pwdスタンドアロンバージョンがより有用な情報を提供する方法を説明するのに役立つ投稿だと思います(元の質問に答えることができます)。
アンソニーG-モニカの正義

1
すべての沸騰までこれらの違い-P-L他の回答で述べたオプション。要するに、一部の実装はデフォルトで一方に、一部は他に実装されます。私が手にしなければならないCentosシステムでは、bashの組み込みはデフォルトで論理になり、/bin/pwdデフォルトで物理になりますが、両方ともコマンドラインオプションを受け入れ、指定された結果に同意します。
IMSoP 16

1
質問は、間違った前提に基づいています-「/ var / lib / classに「本当に」いることを知る方法はありますか?」とはいえ...それが本当に何を意味するかを説明することで、彼が本当に探しているものを理解するのに役立ちます。PWD -Pおよび-Lオプションはすでに...言及されていた
dougmc

1
あなたは議論を逆にしています。 ではなくls ..の内容を表示します。/var/lib/home/cpm135/public_html cd ..特別です:シェルは「どのようにしてそこにたどり着いたか」を特別に追跡し、実際にchdir("..")システムコールを行いません。カーネルに関する限り、シェルの現在の作業ディレクトリ(/proc/self/cwd)は単なるmountpoint:inodeペアです。これは、ディレクトリ上の開いているファイル記述子のようなものです。そのため、ディレクトリの名前を変更してもシェルが破損することはありません。(cd .シェルの$PWD変数を更新するため)。あなたは、固定時に、私はこれをupvoteと思いますので、便利なポイントを作っている
ピーター・コルドを

1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.