Unix软链接和路径
我对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
% 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**Trypwd-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
没有任何诡计,因此其行为与系统本机的行为相同。