./ 和 ~/ 之间的区别

Posted

技术标签:

【中文标题】./ 和 ~/ 之间的区别【英文标题】:Difference between ./ and ~/ 【发布时间】:2015-10-04 19:40:05 【问题描述】:

在创建文件路径和 URL 时,我注意到很多时候路径以 ./~/ 开头。

./~/ 开头的文件路径有什么区别?

它们各自是什么意思?

【问题讨论】:

【参考方案1】:

为了完整起见...

path 是当前目录中名为path 的文件或目录。 ./path 是当前目录下名为path 的文件或目录,目录拼写出来。 . 是当前目录,path 是当前目录中的文件或目录的名称。 ~/path$HOME/path 的简写,其中 $HOME 是一个引用您的主目录的变量。通常,您的主目录将位于 /home/you/Users/you 之类的地方,其中 you 是您的帐户名。 (命令echo "$HOME" 将显示您的主目录。)展开后的值是一个绝对路径(除非您彻底弄乱了$HOME 的值),如初始斜线所示。 /path 是一个绝对路径,它指向一个名为 path 的文件或目录,它位于 root 目录 / 中。 Unix 上的每个文件最终都位于从根目录开始的目录树中。

每个以/ 开头的文件名都是一个绝对路径(又名完整路径),它解释了如何从根目录开始到达特定节点。例如,/var/tmp/you/reminder.txt 指的是在目录you 中的文件或目录reminder.txt(可能是一个文件,从名称来看;但 Unix 不在乎你如何称呼你的文件或目录)目录tmp 位于根目录var 中。

每个不以/ 开头的文件名都是一个相对路径,它指示如何从当前目录开始到达特定文件或目录。特殊目录.. 是父目录,特殊目录. 是当前目录。所以path/there指的是当前目录下目录path里面的文件或目录there;和(将鼠标悬停在灰色区域以显示剧透)

there/.././and/back/.. 是一种(邪恶复杂的)方式来引用当前目录下的and 目录,这里我们遍历there 目录,然后回到当前目录;然后留在当前目录;然后引用目录and 中的目录back,然后移回该目录的父目录,以./and 结尾。

除了~/ 表示当前用户的主目录之外,一些shell 和应用程序允许~them/ 表示用户帐户them 的主目录。此外,某些 Web 服务器配置允许每个用户在其目录 ~/public_html 中拥有一个公共网站,并且 URL 符号 http://server/~them/ 将为外部访问者提供用户帐户 them 的站点。

当前目录是 shell 提供的一种便利,因此您不必一直键入长路径。如果你愿意,你可以。

/bin/ls /home/you/Documents/unix-101/directories.txt

是一种冗长但完全有效的说法(假设你在你的主目录中),

ls Documents/unix-101/directories.txt

你也可以说

cd Documents/unix-101
ls directories.txt

在您再次cd 之前,您的所有命令都将在此目录中运行。

(区别在于ls 也会打印您要求它列出的文件的路径。所以ls directories.txt 将简单地打印directories.txtls Documents/unix-101/directories.txt 将打印...那个。)

您始终可以使用绝对路径而不是相对路径,反之亦然;而且您通常需要cd 的任何特定位置(除了一些基本损坏的初学者脚本在运行它们时往往要求您位于特定目录中)。

一个常见的初学者错误是假设脚本或可执行文件的位置决定了它在哪里查找文件;但如果这是真的,ls . 会在bin 目录中显示文件,而不是你当前的目录,不是吗?

当您首次登录时,当前工作目录设置为您的主目录。

“目录”有时被那些还不够大而不会喜欢前者的人称为“文件夹”。


注意它看起来像ls 必须是当前目录中的一个文件,但我们也说它在/bin 中?那是一个不同的问题 (look up $PATH)。

. 不在您的PATH 中时(通常不应如此),您必须说./scriptname 而不是scriptname 以在当前名为scriptname 的可执行文件中运行命令目录。换句话说,这是一个极端情况,您必须明确地拼出 ./ 以指定当前目录中的某些内容(或者等效但冗长地拼出完整的绝对路径,可能使用命令替换 $(pwd)/scriptname 但这确实是pleonastic.)

此外,不要将目录名称 . 与包含单个点的 Bourne shell 命令(也称为 Bash 别名 source)混淆。命令

. ./scriptname

在当前 shell 实例的上下文中运行来自文件 ./scriptname 的命令,而不是在单独的子 shell 中(这正是 ./scriptname 所做的)。换句话说,此命令行调用 dot 目录中的文件 scriptname 上的 dot 命令

【讨论】:

我喜欢你对~/path$HOME/path 的简写的解释。当我第一次开始编程时问这个问题时,这肯定会让事情变得更清楚,而且我相信其他人将来会发现这个解释很有帮助。感谢您在 3 年多之后的详细回复! 很好的解释。就波浪号 (~) 字符而言,它实际上意味着将 ~ 和第一个 / 之间的所有内容视为用户名。如果该空间为空,例如 ~/ 或用户不存在,则默认为当前用户。如果使用 sudo 和恶意字符串以其他用户或 root 用户身份运行脚本,这可能会导致麻烦。 @Skeptycal 谢谢,我只是想添加一段关于~user 的文章。现在完成。 这广泛适用于 Windows 和 DOS 以及其他一些类似的暴行,不同的是 DOS 等有许多文件系统,每个文件系统都有一个单独的驱动器号(分隔符是反斜杠 @987654395 @ 而不是正斜杠 /)。通常C:\ 是第一个硬盘驱动器的根目录(A:\ 是第一个软盘驱动器的根目录)早在 286 天,但也有变化。 What exactly is a current directory 的配套答案概述了类似的事情,重点是解释当前工作目录的概念。【参考方案2】:

./ 表示“从当前目录开始”。 . 指的是当前工作目录,所以像./foo.bar 这样的东西会在当前目录中寻找一个名为foo.bar 的文件。 (附带说明,.. 表示当前目录的父目录。所以../foo.bar 将在上面的一个目录中查找该文件。)

~/ 表示“从主目录开始”。这在不同的场景中可能有不同的含义。例如,在 Unix 环境中,~/foo.bar 将在您的主目录中查找名为foo.bar 的文件,例如/home/totzam/foo.bar。在许多 Web 应用程序中,~/foo.bar 会在 Web 应用程序根目录中查找名为 foo.bar 的文件,例如 /var/http/mywebapp/foo.bar

【讨论】:

【参考方案3】:

./是当前目录

~/是当前用户的主目录

【讨论】:

【参考方案4】:

./ 表示路径是相对于您当前位置的。

~/ 表示路径是相对于您的主目录的。

【讨论】:

【参考方案5】:

我将解释一个简单的例子。正如开发人员所说:

./ 是当前目录。 ~/ 是当前用户的主目录。

这两个文件路径表达式如何帮助我们?假设您要执行一个脚本 (.sh) 并且您在文件所在的同一目录中,那么您可以简单地执行它./filename.sh

当我想在其中添加任何配置时,我主要使用~/ 来访问我的主目录文件,例如.bashrc。它更容易,因为文件路径表达式(用于主目录)感觉更容易,并且可以从任何地方访问文件,而无需担心路径或更改路径。

【讨论】:

以上是关于./ 和 ~/ 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

UNION和UNION ALL两者之间在性能上的区别

socket,tcp,http三者之间的区别和原理

rsync和cp之间的区别

@Autowired、@Resource和@Qualifier之间的区别

List和List之间有啥区别

Http、Https、TCP、UDP之间的区别和联系(非原创)