+ -
当前位置:首页 → 问答吧 → 关於 .. 的疑问

关於 .. 的疑问

时间:2009-12-24

来源:互联网

现有一例如下:
代码:
d00m3d@BlackMesa:~$ ll TEST
ls: cannot access TEST: No such file or directory
d00m3d@BlackMesa:~$ mkdir /tmp/TEST
d00m3d@BlackMesa:~$ ln -s /tmp/TEST TEST
d00m3d@BlackMesa:~$ ll TEST
lrwxrwxrwx 1 d00m3d d00m3d 9 Dec 24 12:14 TEST -> /tmp/TEST
d00m3d@BlackMesa:~$ cd TEST
d00m3d@BlackMesa:~/TEST$ ls -l
total 0
d00m3d@BlackMesa:~/TEST$ touch testfile
d00m3d@BlackMesa:~/TEST$ ls -l
total 0
-rw-r--r-- 1 d00m3d d00m3d 0 Dec 24 12:15 testfile
d00m3d@BlackMesa:~/TEST$ mv testfile ..
d00m3d@BlackMesa:~/TEST$ cd ..
d00m3d@BlackMesa:~$ ls -l testfile
ls: cannot access testfile: No such file or directory
d00m3d@BlackMesa:~$ ls -l /tmp
total 4
drwxr-xr-x 2 d00m3d d00m3d 4096 Dec 24 12:15 TEST
-rw-r--r-- 1 d00m3d d00m3d 0 Dec 24 12:15 testfile
d00m3d@BlackMesa:~$
何以 cd 跟 mv 两个命令的解释不一样?

cd 解作当前目录的上一层,也就是相对的路径,但 mv 却解作 /tmp/TEST 的上一层,亦即是绝对路径

何以不同?不解,请高人赐教。

作者: d00m3d   发布时间: 2009-12-24

引用:
作者: http://zh.wikipedia.org/wiki/符号链接
符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。某些需要特别处理符号链接的程序(如备份程序)可能会识别并直接对其进行操作。
不幸的是,mv 就算是备份程序,软链接对 mv 不是透明的。

作者: AutoXBC   发布时间: 2009-12-24

作为佐证,软链接对 cp 也不是透明的。

作者: AutoXBC   发布时间: 2009-12-24

目录文件的符号链接 与 普通文件还是有区别的

作者: sxzzsf   发布时间: 2009-12-24

原目录和软链接拥有不同的inode号,是两个不同的目录

cd目录不改变实际的硬盘内容,所以怎么理解 .. 是无关紧要的

mv cp 实际操作目录inode号,应该严格按照目录的实体结构来操作的

作者: 飞龙在天   发布时间: 2009-12-24

我测试了 mv cp ln rm rmdir touch cat nano 这些命令,得出的结论是:除了 cd 和 bash complete,所有的相对地址寻址都遵从真实地址。

作者: AutoXBC   发布时间: 2009-12-24

引用:
作者: AutoXBC
引用:
作者: http://zh.wikipedia.org/wiki/符号链接
符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。某些需要特别处理符号链接的程序(如备份程序)可能会识别并直接对其进行操作。
不幸的是,mv 就算是备份程序,软链接对 mv 不是透明的。
谢谢 AutoXBC 兄,说明我考虑 ".." 的解说是错误的方向,应该去了解 symlink 的操作才对了。

作者: d00m3d   发布时间: 2009-12-25

引用:
作者: 飞龙在天
原目录和软链接拥有不同的inode号,是两个不同的目录

cd目录不改变实际的硬盘内容,所以怎么理解 .. 是无关紧要的

mv cp 实际操作目录inode号,应该严格按照目录的实体结构来操作的
飞龙兄能否作详细一点的说明?

作者: d00m3d   发布时间: 2009-12-25

猜测的。

软链接应该是为了方便用户操作而设置的这样一种应用。

系统在文件操作时,应该有严格的规则,具有唯一性

我把软链接作为文件的应用层来看,原目录管理是底层。

这是根据对dos文件系统的理解而作的推测。ext文件文件我没做过仔细研究,应该都是差不多的原理。因为硬盘的柱面、磁头、扇区决定了不可能有太多的差异。

作者: 飞龙在天   发布时间: 2009-12-25

以前从来没注意过这个问题,幸亏从来没有这么使用相对路径和软连接,又多一个规则。

查了查 man bash, help set, help cd, echo $-。
bash 默认内嵌命令 cd 会跟随软连接,可以使用 cd -P 或 set -P 强制 cd 使用物理目录结构。

查询 inode 可以使用 ls -i 或 stat。

作者: 聚焦深空   发布时间: 2009-12-25

引用:
作者: 飞龙在天
这是根据对dos文件系统的理解而作的推测。ext文件文件我没做过仔细研究,应该都是差不多的原理。因为硬盘的柱面、磁头、扇区决定了不可能有太多的差异。

从文件系统角度看,硬盘物理结构是无关的,再说使用的块设备也不一定是硬盘,极端点,甚至可以不使用块设备,如 ramfs、tmpfs。

作者: 聚焦深空   发布时间: 2009-12-25

引用:
作者: 聚焦深空
以前从来没注意过这个问题,幸亏从来没有这么使用相对路径和软连接,又多一个规则。

查了查 man bash, help set, help cd, echo $-。
bash 默认内嵌命令 cd 会跟随软连接,可以使用 cd -P 或 set -P 强制 cd 使用物理目录结构。

查询 inode 可以使用 ls -i 或 stat。
可是系统本身已自带不少此类软连接,/usr/lib 及 /lib 下多不胜数,混乱得很,当然这只是举例,不可能蠢到往乱这些地方乱动,但明显该问题本身在系统里就一直隐藏着而矣

作者: d00m3d   发布时间: 2009-12-25

指向文件的软连接,只会出现在路径末尾,无歧义,是安全的,如 /usr/lib /lib 下的例子。
指向目录的软连接,有可能出现在路径开头与中间,使用绝对路径 并且 无 "../" 出现时无歧义,也是安全的。

指向目录的软连接,只记得经常对其下的子目录或文件有处理,像首贴中例子没遇到过。
幸亏歧义只对包含 ".." 的路径有影响。

如果 /etc/profile 中添加 set -P,可以把歧义问题控制在最小范围。

作者: 聚焦深空   发布时间: 2009-12-25

嘿嘿,完全明白。

其实我发现这个问题也是很偶然的,实际是我在别的目录下发生,但跟顶帖举例的现像是一样的。

以往我惯常把某些分区下的目录用 symlink 来操作,以後也要小心为上了。

作者: d00m3d   发布时间: 2009-12-25

一个不包含符号链接的路径相当于常量,符号链接相当于变量,符号链接的指向表明了变量和常量的函数关系,符号链接可以继续链接符号链接,相当于变量可以复合函数,整个文件系统就是常量和变量组成的多元方程式。

当每一个符号链接都能用物理路径表示时,说明方程式有解,此时文件系统是健康的,当某一个符号链接不能表示时,说明方程误解,此时系统认为这个符号链接是损坏的,损坏的文件链接不能读取,损坏的目录链接不能进入。

当 shell 进行相对定位时,如果源路径和目标路径包含符号链接,相当于未知表达式,需要通过文件系统求出真实解,然后在此基础上进行相对定位。用户如果直接操作包含符号链接的路径有可能出错,那就在维护工作开始前执行一次 cd -P ./ ,解出当前路径的真实值,之后的操作都是安全的。

作者: AutoXBC   发布时间: 2009-12-25