Unix软链接和路径

Unix软链接和路径,unix,directory,symlink,pwd,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/j

我对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**
%cd/usr/local/
%ls-la
总数6
drwxr-xr-x 2根目录512 Jan 19 15:03。
drwxr-xr-x 41根目录系统1024 Jan 20 16:24。。

lrwxrwx 1 root根目录38 Jan 19 15:03 java->/otherDir/java/jdk1.6.0_17**Try
pwd-p
。它不是“除了pwd”,但它确实起到了作用,至少在我的bash 4.0.35 Fedora 12上是这样。YMMV


更新:甚至可以与
sh
一起使用,因此它似乎是可移植的。

这样做是有目的的。如果您先将cd刻录到
/a/b/c/d
,然后再将cd刻录到
,那么您实际上希望进入
/a/b/c
。如果
c
恰好是一个符号链接(或unix术语中的符号链接-但不是软链接),它会将您带到
/f/g/h
,按照您希望的行为,您将在
/f/g
中结束,然后您(或任何程序)无法理解它是如何到达那里的。

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

readlink `pwd`

做您想要的。

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


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

在所有情况下都不可能完全得到你的路径。这有点奇怪,但其变体(加上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 $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 $pwd-P pwd:检索当前目录时出错:getcwd:无法访问父目录:没有这样的文件或目录
这是实现此行为的外壳中内置的假设。在用户了解意外行为之前,这不一定是内置于shell中的假设。一旦适应,它似乎是自然的;我还没有完全相信,这也不是我想要的。IIRC,你可以通过“
cd./…
”来获得天真的行为。对不起,我不清楚你的第一个“That”指的是什么。对于
/a/b/c/.
的情况,您认为内核的行为是什么?
c
/f/g/h/
的符号链接?我想应该是
/a/b/
,但不确定。不,内核的行为是
/a/b/c/。
/f/g
。基于您的访问路径的“直观”行为纯粹是一个shell发明,而且只是一些shell。据我记忆所及,
csh
没有任何诡计,因此其行为与系统本机的行为相同。