假设我已经创建了两个文件夹/tmp
叫parent
和child
。child
包含一个名为的文件,test-child.txt
并且parent
包含一个名为的文件test-parent.txt
。现在,进入parent
并创建指向的符号链接child
。接下来,往里走child
,并尝试复制test-parent.txt
从parent
。bash完成有效,但实际文件复制失败-
cd /tmp
pwd
/tmp
mkdir parent
mkdir child
touch child/test-child.txt
ls child/
test-child.txt
cd parent
ln -sf ../child .
touch test-parent.txt
cd child
cp ../test-parent.txt .
cp: cannot stat ‘../test-parent.txt’: No such file or directory
为什么 ??
而且,当我在室内时child
,如果我说-
pwd
/tmp/parent/child
外壳程序会跟踪符号链接,以方便用户使用。这具有很好的效果cd foo && cd ..
,即使foo
是到目录的符号链接,也总是返回到原始目录。它有两种缺点:主要的缺点是其他程序不以这种方式运行;另一种是其他程序不能以这种方式运行。另外,符号目录跟踪会带来自身的问题(符号链接更改时会发生什么?如果进程没有读取符号链接的权限会发生什么?等)。
Shell只能执行此操作,因为它们会跟踪所有目录更改,因此它们会记住您的到达方式。当一个新的过程开始时,它不会获得此历史信息。在..
后台,它通过从当前目录向上移动,找到链接直到到达根¹来找到它所在的位置。
如果通过符号链接到达目录,则可以pwd
通过调用来打印出带有内置符号的无符号链接的路径pwd -P
。如果您从外壳程序调用另一个程序,请不要向其传递包含..
符号链接组件之后的路径,因为该程序会以不同的方式解释它。相反,可以..
通过调用来消除这些组件pwd -P
:
cp "$(cd .. && pwd -P && echo /)test-parent.txt" .
如果您想忘记cd
Shell会话中过去命令中使用的符号链接,则可以运行
cd "$(pwd -P && echo /.)"
这将更改为已经存在的当前目录,因此它不会有效地更改Shell进程的当前目录,但是会更改Shell跟踪到当前目录的路径,从而使其没有符号链接。
¹这是getcwd
通话的传统操作方式。某些内核确实会跟踪当前目录,但不会跟踪符号链接,如果没有其他原因(也是由于符号链接的微妙情况),则是为了向后兼容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句