linux - Linux 中两条看似等效的路径,一条有效,一条无效

标签 linux command-line

我位于目录 ~/www 中,并且正在尝试编辑 ~/.bashrc

我执行了 vi ../.bashrc 并且 Vim 创建了一个新的空文件。

我执行了 cd ..vi .bashrc 并且打开了正确的文件。

这应该发生在 Linux 中吗?

编辑: 我刚刚在 ~/www 中尝试了 touch ../.bashrc,但找不到应该创建的文件。

最佳答案

如果当前目录是符号链接(symbolic link),则会发生这种情况。

当您 cd 到符号链接(symbolic link)时,.. 将引用符号链接(symbolic link)目标的父级:

$ ln -s /tmp mylink
$ cd mylink
$ pwd
/home/me/mylink
$ realpath .
/tmp
$ realpath ..
/

但是,bash 会因为聪明而让你感到困惑,并且让 cd .. 表现不同。这是帮助光盘:

`..' is processed by removing the immediately previous pathname component back to a slash or the beginning of DIR.

这意味着当您cd ..时,bash会神奇地将您从/home/me/mylink带到/home/me 。这种差异非常令人困惑,但也非常有用。

如果你使用cd -P ..,这个魔法不会被调用,它会把你从/home/me/mylink带到/,就像所有其他工具一样。


当您意识到 .. 绝不是表示“父目录”的特殊语法时,这会更容易。每个目录实际上都有一个诚实的 Linus 条目,名为 ..

在较旧的 Unix 系统上,这只是一个方便的约定,mkdir/foo/bar 也会自动 ln/foo/foo/bar/..可以根据需要删除或重新链接。如今,它是由文件系统严格执行的。

显然,/tmp/.. 链接到 /,并且这不会仅仅因为您按照符号链接(symbolic link)到达 /tmp.

关于linux - Linux 中两条看似等效的路径,一条有效,一条无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39730965/

相关文章:

java - Runtime.getruntime().exec() 在 Linux 上不起作用

c++ - 如何将 Gstreamer 程序转换为通过 udp 将视频流式传输到 Qt 程序中?

linux - 在 Yocto 上安装 NFS 包

linux - Shell 脚本 - 两个 for 循环和更改文件扩展名

ruby - 将长文件名转换为短文件名 (8.3)

python - 命令行提示错误

c - 发送带有修改报头的 TCP 段

javascript - 从命令行自动生成文件夹和 .js 文件

linux - 使用内连接连接两个 TSV 文件

c - 在 C 中处理/解析命令行参数