Contents

在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!