2010-01-20 171 views
2

我有点困惑unix中的软链接是如何工作的。看例子。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的总和。不是他们当前的位置。

回答

3

这样做的目的就是这样。如果你cd到/a/b/c/d,然后cd到..,那么你切实希望在/a/b/c。如果c碰巧是一个符号链接(或unix术语中的符号链接,但不是软链接),它将带您到/f/g/h,您希望最终会在/f/g的行为,然后您(或任何程序)不会了解它是如何到达那里的。

+3

这是内置到实现此行为的shell中的假设。它不一定是内建在用户的假设,直到他们熟悉意外的行为。一旦适应环境,似乎有点自然;我仍然不完全相信,并不总是我想要的。 IIRC,你可以用'cd ./ ..''来获得天真的行为。 – 2010-01-20 22:46:09

+0

对不起,我不清楚你的第一个“That”是指什么。 你认为内核在'/ a/b/c/..'的情况下的行为,其中'c'是'/ f/g/h /'的符号链接?我认为这将是'/ a/b /',但不确定。 – 2010-01-20 22:51:45

+0

不,内核的行为是'/ a/b/c/..'是'/ f/g'。基于你的访问路径的“直观”行为纯粹是一个壳发明,只有一些shell。据我记得,'csh'没有任何欺骗,因此表现得与系统本身一样。 – ephemient 2010-01-21 00:24:30

4

尝试pwd -P。这不是“除pwd之外”,但它的确有诀窍,至少在Fedora 12上的bash 4.0.35上。YMMV。

更新:即使与sh,所以它似乎是便携式。

1

可以使用的readlink当前工作目录,以获得真正的目录名称:

readlink `pwd` 
1

通常情况下,pwd应返回/usr/local/java在最后一行,如果我明白你的例子。但是一些shell有内部版本pwd命令试图更加“智能”处理当前工作目录中的符号链接。

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

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