2

UNIXでソフトリンクがどのように機能するかについて少し混乱しています。例を参照してください。

% cd /usr/local/
% ls -la
total 6
drwxr-xr-x   2 root     root         512 Jan 19 15:03 .
drwxr-xr-x  41 root     sys         1024 Jan 20 16:24 ..
lrwxrwxrwx   1 root     root          38 Jan 19 15:03 java -> /otherDir/java/jdk1.6.0_17 **<- this is a soft link**

% cd java **<- move to the softlink**

% pwd
/usr/local/java **<- the current location, say LOCATION_A**

% cd /otherDir/java/jdk1.6.0_17/ **<-move to the location of the softlink**

% pwd
/otherDir/java/jdk1.6.0_17 **<- the new current location, say LOCATION_B**

LOCATION_AがLOCATION_Bであっても、パスが異なるという問題はありませんか?

(ユーザーがそこに行く方法だけでなく)ファイルの実際の場所を提供するコマンド(pwd以外)はありますか?

pwdはユーザーのCDの合計にすぎないように私には思えます。現在の場所ではありません。

4

6 に答える 6

4

試してみてくださいpwd -P。「pwd以外」ではありませんが、少なくともFedora 12.YMMVのbash 4.0.35ではうまくいきます。

更新:でも動作するshので、移植可能のようです。

于 2010-01-20T22:41:18.300 に答える
3

これは、目的を持ってこのように動作します。cd to し/a/b/c/dてから cd to..すると、現実的には/a/b/c. cたまたまシンボリック リンク (または UNIX 用語ではシンボリック リンク - ただし、ソフト リンクではない) に移動する場合、目的の/f/g/h動作で終了し、/f/gあなた (または任意のプログラム) がその方法を理解できないでしょう。そこに着きました。

于 2010-01-20T22:41:59.390 に答える
1

通常、私があなたの例を理解していれば、最後の行にpwd戻る必要があります。/usr/local/javaただし、一部のシェルには、現在の作業ディレクトリでシンボリックリンクをより「インテリジェント」に処理しようとする組み込みコマンドがあります pwd

試してみてください/bin/pwd、他の結果が得られますか?

于 2010-01-20T22:48:46.177 に答える
1

現在の作業ディレクトリで readlink を使用して、実際のディレクトリ名を取得できます。

readlink `pwd`
于 2010-01-20T22:42:31.390 に答える
0

realpathは、あなたが望むことを行います。

于 2010-01-20T22:43:28.110 に答える
0

すべての状況で絶対にパスを取得することはできません。これは少し奇妙ですが、これのバリエーション (および chroot と setuid) がプロセスのロックダウンに使用されることがあります。

$ mkdir -p /tmp/a/b
$ cd /tmp/a/b
$ rmdir /tmp/a/b
$ chmod 0 /tmp/a
$ rmdir /tmp/a
$ ls ..
ls: ディレクトリを開けません ..: アクセス許可が拒否されました
$ ls -アル
合計 0
$ pwd -P
pwd: 現在のディレクトリの取得中にエラーが発生しました: getcwd: 親ディレクトリにアクセスできません: そのようなファイルまたはディレクトリはありません
于 2010-01-20T23:45:46.893 に答える