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