不带前导斜杠的路径

不带前导斜杠的路径

在路径中,可以使用相对路径和绝对路径。

  • /: 根目录
  • ./:当前目录
  • ../:父目录

但是当您不使用前导斜杠时,例如,cd path/to/dir它就像您正在使用一样cd ./path/to/dir

有区别吗?如果没有,那么./当没有它时,它的工作方式是一样的,那么它的目的是什么?

答案1

标准文件访问没有区别。像这样的路径./foo是有效的,因为.作为路径组件是有效的,并且不需要故意使它们无效,因此即使您不需要使用变体,它们仍然有效./

具体来说,有以下区别cd:像foo和这样的路径foo/bar 不是保证在 cd 到这些路径时引用当前目录 — shell 还会尝试使用 来解析它们$CDPATH,而使用 明确锚定的路径./则不会这样做。这与可执行文件的 $PATH 查找非常相似。

其他程序对裸文件名的处理方式也可能不同(通常类似地对不包含 的名称执行路径搜索/)。另一个例子是,“systemd-tmpfiles foo.conf”将在标准系统目录中查找 foo.conf,而不是在当前目录中。

使用的能力./最终会以其他方式发挥作用。特别是,因为这样的路径以 开头.,这意味着它没有-以或或其他可能的特殊字符开头@;例如,您可以 rm 类似的路径./--help

(它对于编写连接路径的通用代码也很有用,例如,$dir/foo如果将 $dir 设置为,它仍然可以按预期工作.,而无需对当前目录进行特殊处理。)

答案2

当您使用 时./,您声明您引用当前文件夹中的文件。当您使用path而不使用 时,您可能不打算从当前文件夹执行命令。

在早期的 Linux 时代,开发人员担心恶意软件会将其程序伪装成当前文件夹中的标准 Linux 应用程序。例如,如果您使用恶意软件,su它会在当前文件夹中被发现并窃取您的登录名和密码。

作为预防措施,一些 Linux 发行版仍然不会接受从当前文件夹执行程序,除非在可执行文件名称前面添加.\ 。(我已经被坑过不止一次了。)

相关内容