ディレクトリと相対パスへのシンボリックリンク


15

ディレクトリへの絶対パス(Blink)でシンボリックリンクを作成しました。たとえば次のツリーがあります。

$ ls -l /tmp/A
total 0
lrwxrwxrwx 1 root root 6 Apr  3 12:27 Blink -> /tmp/B
-rw-r--r-- 1 root root 0 Apr  3 12:27 foo

$ ls -l /tmp/B
total 0
-rw-r--r-- 1 root root 0 Apr  3 12:27 bar

次に/ tmp / Aに移動し、ディレクトリをBlinkに変更します。

$ cd /tmp/A
$ pwd
/tmp/A
$ cd Blink
$ pwd
/tmp/A/Blink

cd ..に戻りますが/tmp/A 、たとえば入力するとls ../fooエラーが発生します:

ls: ../foo: No such file or directory

builtin cdコマンドは必要に応じてパスを解決しますが、外部lsは..を/ tmp / Bの上位レベルと見なし、fooを見つけることができません。

ここで問題は何ですか?../fooのような相対パスで/ tmp / A / Blinkからfooファイルを取得できますか?


同じ質問は上クロスポストされたスーパーユーザ
Peter.O

回答:


13

これができるとは思わない。最近のシェルは、ファイルシステムとOSに依存するだけでなく、現在の作業ディレクトリを名前で追跡し、現在のディレクトリを追跡します。つまり、ビルトインcdは、単に「..」チェーンをたどるのではなく、シンボリックリンクを「バックアップ」することができます。

しかし、あなたが実行するとls ../foolsシェルはシンボリックリンクをたどって、ディレクトリになったことを認識していません。 「../foo」に対してlsaを実行しstat()ます。「..」の部分は、現在のディレクトリから取得されます。現在のディレクトリには、親の単一の「..」エントリしかありません。シンボリックリンク全体は、ディレクトリが単一の「。」を持つ方法を変更しません。および単一の「..」エントリ。シンボリックリンクを使用すると、カーネルは間接的なレイヤをファイルパスに追加できます。"../whatever"をopen()orに渡すstat()と、カーネルは呼び出しを行っているプロセスの現在の作業ディレクトリを使用して、 ".."によって名前が付けられている単一のディレクトリを判別します。


17

シェルは、現在の作業ディレクトリをに保存し$PWDます。これがシェルのビルトインcdとに使用されているものpwdで、これまで見てきたように、シンボリックリンクを通常のディレクトリとして扱います。時にはこれが役立つこともあれば、役に立たないこともあります。

pwdhelp pwd詳細についてはtype)を使用して、実際のディレクトリを見つけることができます:

$ pwd
/tmp/A/Blink
$ pwd -L
/tmp/A/Blink
$ pwd -P
/tmp/B

同様にcd、オプションがあります-P(再び、help cdあなたの友人です):

$ cd /tmp/A/Blink
$ pwd
/tmp/A/Blink
$ cd -P ..
$ pwd -P
/tmp

最後に、「機能」を完全にオフにすることができます。

$ set -P
$ cd /tmp/A/Blink
$ pwd
/tmp/B

おかげで、set -P機能については知っていますが、lsコマンドの動作に混乱していました
...-user478681

set -P先ほど言ったように、use とlsの動作は意味を成し始めます。:)
AMS

2

ブルースとアムスは、背後にある行動を説明する美しい答えを与えました。しかし、実際にls ../fooあなたが求めていたことをするために、あなたは次のようなもので行くことができます

ls $(dirname $PWD)/foo

1

できないから /tmp/A/Blink 実際に/tmp/B。だから、ls ../A/foo動作します。

代わりに、実際cdできると便利だと思うかもしれません /tmp/Bディレクトリではなく、エイリアス/tmp/A/Blink。そのためには、代わりに次の関数を使用cdできます(.bashrcに配置できます)。

lcd() { cd $(readlink -f "$1"); }

lcdもちろん、通常のディレクトリとシンボリックリンクされたディレクトリの両方で機能します。
注意:readlink -fリンクの最終ターゲットで動作します(リンクがデイジーチェーン接続されている場合)。


1
cd -Pよりシンプルに思えます。
jw013

@ jw013:そのとおりです。そうです。私は感謝..それに気づいていなかった
Peter.O
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.