通过符号链接引发的UNIX路径歧义问题咨询
为什么
cp和cd处理..的行为不一样? 这个问题其实是UNIX/Linux系统里逻辑路径 vs 物理路径的经典差异,我给你拆成大白话讲清楚:
先搞懂cd的逻辑:跟着你的"操作路径"走
当你通过cd A(A是指向/B/C/D/A的符号链接)进入目录时,你的shell(比如bash)会贴心地记住你是从/noob/进到/noob/A这个逻辑路径的,而不是直接跳到真实的物理位置/B/C/D/A。
所以当你输入cd ..时,shell会直接回到这个逻辑路径的父目录——也就是/noob/,这是为了符合你的直觉:你是从/noob点进来的"快捷方式",退回去当然要回到/noob。
再看cp的逻辑:只认"真实物理位置"
而cp这类工具(包括ls、mv在内的大多数命令)不会管你是怎么进到当前目录的,它们会先解析出当前目录的真实物理路径——也就是/B/C/D/A。
当你写cp abc ..时,..在这里指的是物理路径的父目录/B/C/D/,所以文件自然就被复制到那去了。
简单类比一下
把符号链接A比作你电脑桌面上的一个快捷方式,指向D盘某个文件夹:
- 你双击快捷方式进去后,Windows资源管理器的地址栏显示的是快捷方式所在的桌面路径(对应shell的逻辑路径),点"返回上级"就回到桌面;
- 但如果你在这个文件夹里用命令行复制文件到
..,命令行只会看这个文件夹的真实父目录(D盘的上级),而不是桌面。
怎么解决这个问题?
如果想把abc复制到/noob/,最稳妥的方式是直接写绝对路径:
cp abc /noob/
或者如果你刚从/noob/过来,也可以用shell的环境变量$OLDPWD(它记录了你上一次所在的目录):
cp abc "$OLDPWD"
内容的提问来源于stack exchange,提问作者dr_xemacs
相关产品推荐
相关产品推荐

