在Linux中什么是双点( Double Dot )和单点( Single Dot )?
1. 概述
在本文中,我们将了解Linux 中神秘的双点( .. ) 和单点 ( . ) 的含义。
2. Linux 索引节点
在 Linux 中,inode 是一种数据结构,用于存储文件的所有信息,但文件名和内容除外。**在一个目录中,所有文件都作为条目存在,具有文件名和用于获取信息的相应 inode 编号。**Inode 包含以下信息:
- 创建/修改时间
- 尺寸
- 权限
- 所有者
**Inode 编号是文件系统中的唯一整数,仅指单个文件。**索引节点通常存储在分区的开头。即使空间可用,用尽 inode 也会导致“没有剩余空间”错误。我们也可以使用 inode 编号来查找文件的所有链接 。
我们可以使用带有*-i*标志的ls 命令来列出 inode 编号和文件名:
$ cd /usr/bin
$ ls -i
71520 [
71521 [[
48516 aconnect
71522 acpid
71523 add-shell
129429 addgnupghome
71524 addgroup
127833 addpart
30369 addr2line
...
3. Linux 硬链接
文件名与其元数据的分离允许实现硬链接。**硬链接只是指向给定文件的 inode 的指针,因此它指向文件系统上的相同位置。**它不是文件的副本,因此对硬链接的修改也会修改原始文件。
我们可以使用ln命令创建硬链接:
$ echo hello > original
$ cat original
hello
$ ln original hardlink
$ echo "This will modify the original" >> hardlink
$ cat original
hello
This will modify the original
$ ls -i original hardlink
89 hardlink 89 original
正如我们所见,它们都有相同的对应 Inode。**我们应该注意,即使我们删除了原始文件,硬链接仍然可以访问。**这是区分硬链接和符号链接 的主要点。
4. ‘.’ 和“..”是什么意思?
**’.’ 和 ‘..’ 类似于我们上面讨论的硬链接,因为它们增加了 Inode 的链接数,但我们也不能删除它们,因为它们是内置在文件系统中的。*此外,目录的硬链接是不可能的。因此我们不能准确地将它们称为硬链接,更准确的术语是“name-inode map”*。
在文件系统中,我们使用双点 ( .. ) 来访问父目录,而单点 ( . ) 表示当前目录。
让我们尝试使用realpath 来确认这一点:
$ pwd
/tmp/somedir
$ realpath .
/tmp/somedir
$ realpath ..
/tmp
这里*/tmp/somedir是当前目录,/tmp*是它的父目录。
我们可以在文件名前加上一个点 (.) 来“隐藏”它,所以它只有在我们将-a标志传递给ls*时才会显示:*
$ echo "Hello" > normal_file
$ echo "Secret" > .hidden_file
$ ls
normal_file
$ ls -a
. .. .hidden_file normal_file
5. 使用“.” 和 ‘..’ 在 Bash
这可能会让人感到惊讶,但双点和单点在 bash 中也有它们的应用。但是,这与它们在文件系统中的常规用法不同。
在 Bash 中,双点 ( .. ) 用于生成数字或字符等序列:
$ echo {1..10}
1 2 3 4 5 6 7 8 9 10
$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
我们指定双点之前的起点和之后的终点。
我们使用单点(.)来获取source ,这基本上意味着在当前 shell 中执行它:
$ echo "export VARIABLE='This variable will be set in the shell!'" > source_me
$ . ./source_me
$ echo "$VARIABLE"
This variable will be set in the shell!