在路径中,可以使用相对路径和绝对路径。
/
: 根目录./
:当前目录../
:父目录
但是当您不使用前导斜杠时,例如,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 发行版仍然不会接受从当前文件夹执行程序,除非在可执行文件名称前面添加.\
。(我已经被坑过不止一次了。)