acrofox 于 2010-01-18 12:47:34发表:
先说简短的, cp -u 是那么回事。
再说长的。
我那个例子中没有省略,就是原样输入就可以了。
这么说吧,如果你 cd /usr/local/bin,那么这时你打开 ../Adobe/Reader8/bin/acroread 就等同于打开 /usr/local/Adobe/Reader8/bin/acroread,因为那个 ../ 把你带到了上一层目录 /usr/local。
不难理解,如果你在 /usr/local/bin 目录下执行 ln 命令,那么可以用:[code]ln -s ../Adobe/Reader8/bin/acroread .[/code]但是如果当前目录在 /usr/local 下,还想在 /usr/local/bin 下建立符号链接,该怎么办呢?
常常有人想当然地执行[code]ln -s Adobe/Reader8/bin/acroread bin[/code]结果却得到一个 broken symbolic link。
其实这时你只要把源改为相对于 /usr/local/bin 目录的相对路径,也就是说当当前目录在 /usr/local/bin 下时应该采用的相对路径,就没有问题了。所以正确的命令是:[code]ln -s ../Adobe/Reader8/bin/acroread bin[/code]源使用绝对路径当然也可以,但效果是有差别的。
使用绝对路径的好处是,你可以把符号链接移到别的地方,链接仍然有效。
使用相对路径的好处是,你可以把符号链接及其所指向的目标一所处的目录结构一起移到别的地方,符号链接仍然有效。
再拿上面的例子来说,如果使用绝对路径建立 acroread 的符号链接,那么如果把 /usr/local 这个分区(假设单独分区了)挂载到了 /software 目录上,那么符号符号链接已经失效了,因为 /usr/local/Adobe/Reader8/bin/acroread 已经变成 /software/Adobe/Reader8/bin/acroread 了。但是如果使用我给的那种相对路径,那么符号链接仍然有效。因为当 /usr/local/bin/acroread 变成了 /software/bin/acroread 时,站在它所处的目录中看,../Adobe/Reader8/bin/acroread 正好是 /software/Adobe/Reader8/bin/acroread。
如果你用的系统是 Debian/Ubuntu,那么 /usr/bin 下一定有很多文件是采用相对路径的符号链接(其它系统也可能有,但我不了解)。不管当前目录在哪,你用 file 命令查看一个符号链接时,表示目标的字符串都是不变的。比如我的系统中 /usr/bin/xulrunner-1.9 总是指向 ../lib/xulrunner-1.9.0.17/xulrunner。当你在 /home/tom 下时,../lib/xulrunner-1.9.0.17/xulrunner 这个文件是不存在的,但这并不影响你使用 /usr/bin/xulrunner-1.9,因为系统知道那就是 /usr/bin/../lib/xulrunner-1.9.0.17/xulrunner,即 /usr/lib/xulrunner-1.9.0.17/xulrunner。
钻点牛角尖很好,能把问题弄明白。