2244 字
11 分钟
Linux 命令行基础

命令行#

1. The Shell#

什么是 Shell ? Shell 本质上是一个程序,从键盘接收命令,然后发送给操作系统执行。

像一些图形用户界面的 “Terminal” 或 “Console” 这样的程序,它们实际上是用来启动一个 shell 的工具

接下来,我们将使用 bash shell (Bourne Again shell)

还有其它的 shell,但是我们不会涉及

Shell 提示符

Shell 提示符(shell prompt)可能会有所不同,但通常会遵守以下格式:

username@hostname:current_directory

例如:

shell_prompt

请注意提示符最后的 $符号

不同的 shell 会使用不同的提示符,但以 bash shell 为例,普通用户的提示符号通常是$

在你输入命令的时候,不需要输入这个符号,它只是用于标识提示符的而已

第一条命令:echo

echo 回声,顾名思义,**原样显示(回声在)**终端上

echo

同样地,我们可以试试 date(日期,显示当前的日期和时间),和 whoami(我是谁,显示当前用户名),看看会输出什么?

date_whoami

2. pwd (Print Working Directory)#

在 Linux 中,一切皆文件

所有的文件都被组织在一个分层的目录树(hierarchical directory tree)中,这个目录的结构的起点叫做根目录(root directory),用一个斜杠 / 来表示

根目录下面可以包含很多的文件夹和文件,而每个文件夹里又可以继续包含更多的文件夹和文件,就像一颗倒挂的树

/
|-- bin
| |-- file1
| |-- file2
|-- etc
| |-- file3
| `-- directory1
| |-- file4
| `-- file5
|-- home
|-- var

这个结构的意思是:

  • / 是根目录
  • /bin 的目录下有 file1file2
  • /etc 下有 file3 和一个子目录 directory1,这个子目录中还有 file4file5
  • /home/var 也是根目录下的文件夹

其中,这些文件和目录的名字称之为路径

例如,如果你有一个名为 home 的文件夹,里面有一个子文件夹叫做 elo,而在 elo 里面又有一个子文件夹叫做 Movies,那么这个路径会长这样:

Terminal window
/home/elo/Movies

如果我们希望在文件系统中来去自如,我们首先就需要知道当前所在的目录位置,可以使用 pwd 命令

例如:

pwd

3. cd (Change Directory)#

现在你已经知道“我在哪了”,现在我们试试看如何在文件系统中“走动”

记住,我们在文件系统的“导航”是通过“路径”来实现的。而路径有两种方式:

1. 绝对路径(Absolute Path)

  • 根目录开始写出的完整路径
  • 根目录就像树的根,所有路径都从这里开始
  • 只要路径以 / 开头,那就是绝对路径

例如:

Terminal window
$ cd /home/elo/Desktop

意思是:进入根目录 / → 然后进入 home → 然后进入 elo → 然后进入 Desktop

2. 相对路径(Relative Path)

  • 这是相对于你当前所在目录来写的路径
  • 不需要从 / 开始,而是从当前位置出发

如果你已经在:

Terminal window
/home/elo/Documents

你想进入这个目录里的子目录叫做 taxes,你不需要写完整路径 /home/elo/Documents/taxes,你只要写:

Terminal window
$ cd taxes

对于以上两种路径,例如,为了到达 /home/elo/test/a/b 这个文件夹内,如果我们想使用绝对路径:

absolute_path

假设我们已经在 /home/elo/test/a,那么直接使用如下命令:

relative_path

不过,总是使用相对路径和绝对路径也是很累的,仍然有些快捷路径可以帮助我们导航:

  • .:当前目录
  • ..:上一级目录
  • ~:用户主目录
  • -:上次访问过的目录
Terminal window
$ cd . # 留在当前目录
$ cd .. # 回到上一级目录
$ cd ~ # 回到主目录(比如/home/elo)
$ cd - # 回到一个你刚才去过的目录

shortcut

4. ls(List Directory)#

现在我们已经在知道如何再文件系统中移动了,可是,我们如何知道当前目录下有哪些东西呢?

我们可以使用一个很有用的命令: ls

默认情况下,它会列出当前目录下的目录和文件夹

Terminal window
$ ls

如果想查看某个特定目录里的内容,也可以在后面加上路径:

Terminal window
$ ls /home/elo

命令参数(Command Options / Flags)

在 Linux 中,很多命令可以通过添加**参数(也叫选项、flag)**来扩展或改变行为,例如:

Terminal window
$ ls -l

这些字母告诉命令要”怎么做“,或者”做的更详细“

例如刚刚的示例命令,l 代表 long format(长格式),它会显示每个文件的详细信息

包括权限、链接数、拥有者,用户组,大小,时间戳,文件名

另外,在 linux 中,不是所有文件都是默认可见的,. 开头的文件都是”隐藏文件“

如果希望查看隐藏文件,可以使用 -a(a 代表 all)

ls_1

5. touch#

现在学习如何创建文件,可以使用如下简单的方法:

Terminal window
$ touch filename

该命令会创建一个名为 filename 的空文件(如果该文件不存在的话)。

创建文件后,可以使用 ls -l 查看文件的详细信息,在这些信息中,我们更关注的是它的时间戳(即最后修改时间)

事实上,touch 的本意是“轻轻触碰一下文件”,不会修改文件的内容,它原本的用途是更新文件的时间戳

但当指定的文件不存在时,touch自动创建一个新的空文件,所以也常被用来创建文件。

touch

6. file#

与我们所熟悉的 Windows 系统不同,Windows 系统通过文件扩展名来判断文件的类型

在 Linux 系统中,文件名只是一个字符串标签,Linux 主要通过文件的具体内容来判断类型

我们可以使用 file 命令来查看文件究竟是何种类型

Terminal window
$ file filename

这很简单,但是在此我更想解释一下 Linux 系统识别文件的机制

touch

魔术数(magic number)识别机制

在 Linux 中,判断一个文件类型并不是只看扩展名,而是通过检查文件内容的前几个字节

这些字节叫做 魔术数,它们是某种文件格式在开头的标志。 例如:

  • PNG 文件以 89 50 4E 47 开头(对应 .PNG
  • JPG 文件以 FF D8 FF 开头
  • PDF 文件以 %PDF25 50 44 46)开头

这些魔术数是由文件格式规范定义的,具有唯一性。

fake

例如图中这个例子,虽然我们创建了一个名为 fake.png 的文件,使用 file 命令查看的时候,显示的类型却是一个 ASCII 字符编码的 纯文本

事实上,文件扩展名 .jpg.png.txt 在 Linux 中不是强制规定的,只是给人类看的

Linux 真正识别的是文件头部内容,即之前所说的魔术数

content

使用特殊的命令查看该文件以后,可以得到 fake.png 的具体内容,它的开头是:

Terminal window
00000000 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 61 6c |This is not real|

这些字节没有任何魔术数结构,所以系统判断为 ASCII 编码的纯文本

当我们查看一个真正的 png 文件的时候,会看到这样的形式:

png

该 png 文件的开头是:

Terminal window
00000000 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 |.PNG........IHDR|

其中的 89 50 4E 47 是标准的 PNG 魔术数,后续的 IHDR 是图像头块,这是所有 PNG 必备结构

那么,是否存在一种情况,文本文件第一排的内容恰好和 PNG 文件的开头内容重合?

fake_png

可以看到它被识别为了 PNG,尽管我们知道它实际上不是

当 Linux 识别一个文件的时候,识别流程如下:

  1. 优先检查魔术数(Magic Number)file 首先会读取文件的前几个字节,查找是否匹配已知文件格式的魔术数(如 PNG、PDF、ZIP 等)。如果魔术数匹配,并且后续结构合理,立即判定为对应的格式文件。

  2. 结构校验: 如果魔术数匹配但文件结构异常(如缺失关键块),file 可能不会确认格式,而是退回为 data 类型,表示“无法识别但可能是二进制”。

  3. 未命中魔术数时执行内容分析: 如果没有识别出魔术数,file 会检查文件是否只包含可打印字符(ASCII 或 UTF-8)、是否有换行符、是否存在乱码等特征,以判断是否为文本文件,如 ASCII textUTF-8 Unicode text 等。

  4. 最终默认类型为 data: 若既没有魔术数,也无法判定为文本,file 会将该文件归类为 data,表示其为原始的二进制或未知内容。

对着顺序再次查看之前的内容,就可以清晰的了解 Linux 是如何识别文件类型的了

Linux 命令行基础
https://mizuki.mysqil.com/posts/linux/2_command_line/
作者
Elopez
发布于
2025-09-20
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00