Unix软链接和路径

时间:2010-01-20 22:37:38

标签: unix directory symlink pwd

我对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的总和。不是他们当前的位置。

6 个答案:

答案 0 :(得分:4)

试试pwd -P。它不是“除了pwd”,但它确实有这个诀窍,至少在Fedora 12上我的bash 4.0.35 .YMMV。

更新:甚至适用于sh,因此它似乎是可移植的。

答案 1 :(得分:3)

这样做有目的。如果您转到/a/b/c/d然后再转到..,那么您实际上希望进入/a/b/c。如果c恰好是一个符号链接(或unix术语中的符号链接 - 但不是软链接),则会将您带到/f/g/h,您希望拥有的行为最终会在{{1}然后你(或任何程序)不会理解它是如何到达那里的。

答案 2 :(得分:1)

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

readlink `pwd`

答案 3 :(得分:1)

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

试试/bin/pwd,你会得到其他结果吗?

答案 4 :(得分:0)

realpath做你想做的事。

答案 5 :(得分: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: cannot open directory ..: Permission denied
$ ls -al
total 0
$ pwd -P
pwd: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory