./ 和 ~/ 之间的区别

Difference between ./ and ~/

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

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

它们各自是什么意思?

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

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

./为当前目录

~/是当前用户的主目录

./ 表示 "starting from the current directory"。 . 指的是当前工作目录,所以像 ./foo.bar 这样的东西会在当前目录中寻找一个名为 foo.bar 的文件。 (作为旁注,.. 表示引用当前目录的父目录。因此 ../foo.bar 将在上面的目录中查找该文件。)

~/ 表示 "starting from the home directory"。这在不同的场景下可能有不同的含义。例如,在 Unix 环境中 ~/foo.bar 将在您的主目录中查找名为 foo.bar 的文件,类似于 /home/totzam/foo.bar。在许多 Web 应用程序中,~/foo.bar 会在 Web 应用程序根目录中查找名为 foo.bar 的文件,例如 /var/http/mywebapp/foo.bar.

为了完整起见...

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

$ 开头的文件名在其名称中包含 shell 变量的值(例如上面的 $HOME);您必须知道该变量的值才能确定它最终包含的是相对路径还是绝对路径。类似地,文件名开头的 ~ 被 shell 替换(“扩展”)为不同的字符串,如上所述。 (从技术上讲,文件名也可以以文字美元符号或波浪号开头;然后您必须引用或反斜杠转义该字符以避免 shell 将其扩展为其他字符。这是相当不方便,所以这些文件名在实践中往往很少见。)

在下面的说明中,我们参考任何此类替换的结果,并忽略可能引用的复杂性。

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

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

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

结尾

除了 ~/ 表示当前用户的主目录外,一些 shells 和应用程序允许符号 ~them/ 引用用户帐户的主目录 them.此外,一些网络服务器配置允许每个用户在他们的目录 ~/public_html 中有一个 public 网站,并且 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,您的所有命令都将 运行 在此目录中。

有关此相关概念的详细说明,请参阅

“目录”有时被尚未达到喜欢前者年龄的人称为“文件夹”。


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

. ./scriptname

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

Bourneshell(以及Bash、Zsh等衍生品)使用单引号防止变量扩展和通配符扩展,双引号允许变量扩展,但禁止通配符扩展一个字符串。 Windows 上的引用规则不同,通常使用双引号将空格分隔的值保持为单个字符串(并且 % 而不是 $ 用于变量替换)。

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

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

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

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

.表示当前目录

..表示指上一级目录

~表示指的是当前用户的主目录。主目录由 $HOME

表示

这些一般用来提相对路径。每个符号末尾的 / 是一个分隔符,您可以在一起使用这些符号时使用它。

例如:

$ cd ../.. # Go 2 directories backwards
$ cd ~ # Takes you to $HOME directory
$ cd . # Does nothing :) As it literally means go to the directory that you are already present in.
$ cd ~/dir1 $ go to `$HOME/dir1`

在 unix 上,在任何目录中,如果您执行 ls -a,您会看到 ... 将被提及(即使是空目录)。如前所述,这些具有特殊含义并且在 unix 系统中默认生成并且通常有助于提及相对路径(即相对于当前目录的不同目录的路径)

cd 命令是无害的。所以,只需将符号与 cd 命令结合起来玩一下。你最终会掌握它们的。