"./"和"~/"之间的区别是什么?

24
创建文件路径和URL时,我注意到很多时候路径以./~/开头。
./开头的文件路径表示相对于当前目录的路径,而以~/开头的路径则表示相对于用户主目录的路径。
它们各自代表什么意思?
6个回答

36
为了完整性起见... - 只是`path`是当前目录中名为`path`的文件或目录。 - `./path`是当前目录中名为`path`的文件或目录,其中点目录`.`表示当前目录,而`path`是该目录中文件或目录的名称。 - `~/path`是一个简写,表示变量`$HOME`引用您的主目录,通常您的主目录位于诸如`/home/you`或`/Users/you`之类的位置,其中`you`是您的帐户名称。 (命令`echo "$HOME"`将显示您的主目录。) 扩展值是绝对路径(除非您已经彻底破坏了`$HOME`的值),这由初始斜杠表示。 - `/path`是指在根目录`/`中名为`path`的文件或目录的绝对路径。Unix中的每个文件都最终位于以根目录开头的目录树中。 - 以`$`开头的文件名包括shell变量的值在其名称中(例如上面的`$HOME`);您必须知道该变量的值才能确定它最终包含相对路径还是绝对路径。类似地,文件名开头的`~`被shell替换(“扩展”)为另一个字符串,如上所述。 (从技术上讲,文件名可以以文字美元符号或波浪号开头;您将不得不引用或反斜杠转义该字符,以避免shell将其扩展为其他内容。这相当麻烦,所以这些文件名在实践中很少见。) - 在接下来的阐述中,我们将提到任何此类替换的结果,并忽略可能的引用复杂性。 - 以`/`开头的每个文件名都是从根目录开始到达特定节点的完整路径(full path)。例如,`/var/tmp/you/reminder.txt`指的是位于`root`目录中的目录`var`中的目录`tmp`中的目录`you`中的文件或目录`reminder.txt`。 - 不以`/`开头的每个文件名都是相对路径,它指示如何从当前目录到达特定文件或目录。特殊目录`..`是父目录(即包含该目录的目录),而特殊目录`.`是当前目录。因此,`path / there`指的是当前目录中`path`目录内的文件或目录`there`;以及(hover the mouse over the gray area to display the spoiler)。 - `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

假设您位于主目录中,那么“is a longwinded but perfectly valid way to say”是一个啰嗦但完全有效的说法。

ls Documents/unix-101/directories.txt

你也可以这样说

cd Documents/unix-101
ls directories.txt

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

有关这个相关概念的更长阐述,请参见“当前工作目录是什么?”

有时人们会用“文件夹”来称呼“目录”,尤其是那些还不够老练的人。


顺便提一下,别把目录名.与Bourne shell命令混淆,该命令只包含一个点(也被它的Bash别名source所知)。

. ./scriptname

在当前shell实例中运行来自文件./scriptname的命令,而不是在单独的子shell中运行(这就是仅使用./scriptname的情况)。换句话说,这条命令行在点目录中的文件scriptname上调用了点命令

Bourne shell(及其派生品如Bash、Zsh等)使用单引号来防止变量扩展和通配符扩展,而使用双引号允许变量扩展,但在字符串中禁止通配符扩展。在Windows上的引用规则不同,通常使用双引号将以空格分隔的值作为单个字符串保存(并使用%而不是$进行变量替换)。


5
我喜欢你对“~/path”是“$HOME/path”的速记方式的解释。当我刚开始学习编程时,这一定会让问题更清晰,我相信其他人在未来也会发现这种解释很有帮助。即使三年后,非常感谢你提供了如此详细的回答! - Tot Zam
非常好的解释。就波浪线()字符而言,它实际上意味着取出在和第一个/之间的所有内容,并将其视为用户名。如果该空格为空,例如~/或用户不存在,则默认为当前用户。如果使用sudo和恶意字符串以另一个用户或root身份运行脚本,则可能会导致问题。 - Michael Treanor
1
@Skeptycal 谢谢,我刚想着加一段关于~user的内容。现在已经完成了。 - tripleee
这个概念广泛适用于Windows和DOS以及其他一些类似的系统,不同之处在于DOS等有许多文件系统,每个文件系统都有一个单独的驱动器号(分隔符是反斜杠\而不是正斜杠/)。通常情况下,在286时代,C:\是第一块硬盘的根目录(而A:\是第一块软盘驱动器的根目录),尽管存在一些变化。 - tripleee
“286天”指的是英特尔80286 CPU的运行天数,许多年轻读者可能从未听说过。这是稍微更为熟悉的80386或“386”架构的前身。 - undefined

22

./ 意味着“从当前目录开始”。.指的是当前工作目录,所以像./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


6

./ 表示当前目录。

~/ 表示当前用户的主目录。


3

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

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


2

.代表当前目录

..代表父目录

~代表当前用户的主目录。主目录也可以用HOME环境变量表示。您可以在shell上执行echo $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命令进行尝试,你最终将掌握它们。

0

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

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

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

我通常使用~/来访问我的主目录文件,例如.bashrc当我想要添加任何配置时。因为文件路径表达式(对于主目录)感觉更容易,并使得从任何地方访问文件更加容易,而不必担心路径或更改路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接