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 上的 bash 4.0.35 上是这样。YMMV。

更新:甚至可以与 一起使用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

您可以在当前工作目录上使用 readlink 来获取真实的目录名称:

readlink `pwd`
于 2010-01-20T22:42:31.390 回答
1

通常,如果我理解你的例子,pwd应该/usr/local/java在最后一行返回。但是一些 shell 有一个内置 pwd命令,它试图更“智能”地处理当前工作目录中的符号链接。

试试看/bin/pwd,有没有其他结果?

于 2010-01-20T22:48:46.177 回答
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 -al
共 0
$密码-P
pwd:检索当前目录时出错:getcwd:无法访问父目录:没有这样的文件或目录
于 2010-01-20T23:45:46.893 回答