命令行
1. The Shell
什么是 Shell ? Shell 本质上是一个程序,从键盘接收命令,然后发送给操作系统执行。
像一些图形用户界面的 “Terminal” 或 “Console” 这样的程序,它们实际上是用来启动一个 shell 的工具
接下来,我们将使用 bash shell (Bourne Again shell)
还有其它的 shell,但是我们不会涉及
Shell 提示符
Shell 提示符(shell prompt)可能会有所不同,但通常会遵守以下格式:
username@hostname:current_directory例如:

请注意提示符最后的 $符号
不同的 shell 会使用不同的提示符,但以 bash shell 为例,普通用户的提示符号通常是$
在你输入命令的时候,不需要输入这个符号,它只是用于标识提示符的而已
第一条命令:echo
echo 回声,顾名思义,**原样显示(回声在)**终端上

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

2. pwd (Print Working Directory)
在 Linux 中,一切皆文件
所有的文件都被组织在一个分层的目录树(hierarchical directory tree)中,这个目录的结构的起点叫做根目录(root directory),用一个斜杠 / 来表示
根目录下面可以包含很多的文件夹和文件,而每个文件夹里又可以继续包含更多的文件夹和文件,就像一颗倒挂的树
/|-- bin| |-- file1| |-- file2|-- etc| |-- file3| `-- directory1| |-- file4| `-- file5|-- home|-- var这个结构的意思是:
/是根目录/bin的目录下有file1和file2/etc下有file3和一个子目录directory1,这个子目录中还有file4和file5/home、/var也是根目录下的文件夹
其中,这些文件和目录的名字称之为路径
例如,如果你有一个名为 home 的文件夹,里面有一个子文件夹叫做 elo,而在 elo 里面又有一个子文件夹叫做 Movies,那么这个路径会长这样:
/home/elo/Movies如果我们希望在文件系统中来去自如,我们首先就需要知道当前所在的目录位置,可以使用 pwd 命令
例如:

3. cd (Change Directory)
现在你已经知道“我在哪了”,现在我们试试看如何在文件系统中“走动”
记住,我们在文件系统的“导航”是通过“路径”来实现的。而路径有两种方式:
1. 绝对路径(Absolute Path)
- 从根目录开始写出的完整路径
- 根目录就像树的根,所有路径都从这里开始
- 只要路径以
/开头,那就是绝对路径
例如:
$ cd /home/elo/Desktop意思是:进入根目录 / → 然后进入 home → 然后进入 elo → 然后进入 Desktop
2. 相对路径(Relative Path)
- 这是相对于你当前所在目录来写的路径
- 不需要从
/开始,而是从当前位置出发
如果你已经在:
/home/elo/Documents你想进入这个目录里的子目录叫做 taxes,你不需要写完整路径 /home/elo/Documents/taxes,你只要写:
$ cd taxes对于以上两种路径,例如,为了到达 /home/elo/test/a/b 这个文件夹内,如果我们想使用绝对路径:

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

不过,总是使用相对路径和绝对路径也是很累的,仍然有些快捷路径可以帮助我们导航:
.:当前目录..:上一级目录~:用户主目录-:上次访问过的目录
$ cd . # 留在当前目录$ cd .. # 回到上一级目录$ cd ~ # 回到主目录(比如/home/elo)$ cd - # 回到一个你刚才去过的目录
4. ls(List Directory)
现在我们已经在知道如何再文件系统中移动了,可是,我们如何知道当前目录下有哪些东西呢?
我们可以使用一个很有用的命令: ls
默认情况下,它会列出当前目录下的目录和文件夹
$ ls如果想查看某个特定目录里的内容,也可以在后面加上路径:
$ ls /home/elo命令参数(Command Options / Flags)
在 Linux 中,很多命令可以通过添加**参数(也叫选项、flag)**来扩展或改变行为,例如:
$ ls -l这些字母告诉命令要”怎么做“,或者”做的更详细“
例如刚刚的示例命令,l 代表 long format(长格式),它会显示每个文件的详细信息
包括权限、链接数、拥有者,用户组,大小,时间戳,文件名
另外,在 linux 中,不是所有文件都是默认可见的,以 . 开头的文件都是”隐藏文件“
如果希望查看隐藏文件,可以使用 -a(a 代表 all)

5. touch
现在学习如何创建文件,可以使用如下简单的方法:
$ touch filename该命令会创建一个名为 filename 的空文件(如果该文件不存在的话)。
创建文件后,可以使用 ls -l 查看文件的详细信息,在这些信息中,我们更关注的是它的时间戳(即最后修改时间)
事实上,touch 的本意是“轻轻触碰一下文件”,不会修改文件的内容,它原本的用途是更新文件的时间戳。
但当指定的文件不存在时,touch 会自动创建一个新的空文件,所以也常被用来创建文件。

6. file
与我们所熟悉的 Windows 系统不同,Windows 系统通过文件扩展名来判断文件的类型
在 Linux 系统中,文件名只是一个字符串标签,Linux 主要通过文件的具体内容来判断类型
我们可以使用 file 命令来查看文件究竟是何种类型
$ file filename这很简单,但是在此我更想解释一下 Linux 系统识别文件的机制

魔术数(magic number)识别机制
在 Linux 中,判断一个文件类型并不是只看扩展名,而是通过检查文件内容的前几个字节
这些字节叫做 魔术数,它们是某种文件格式在开头的标志。 例如:
- PNG 文件以
89 50 4E 47开头(对应.PNG) - JPG 文件以
FF D8 FF开头 - PDF 文件以
%PDF(25 50 44 46)开头
这些魔术数是由文件格式规范定义的,具有唯一性。

例如图中这个例子,虽然我们创建了一个名为 fake.png 的文件,使用 file 命令查看的时候,显示的类型却是一个 ASCII 字符编码的 纯文本
事实上,文件扩展名 .jpg、.png、.txt 在 Linux 中不是强制规定的,只是给人类看的
Linux 真正识别的是文件头部内容,即之前所说的魔术数

使用特殊的命令查看该文件以后,可以得到 fake.png 的具体内容,它的开头是:
00000000 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 61 6c |This is not real|这些字节没有任何魔术数结构,所以系统判断为 ASCII 编码的纯文本
当我们查看一个真正的 png 文件的时候,会看到这样的形式:

该 png 文件的开头是:
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 文件的开头内容重合?

可以看到它被识别为了 PNG,尽管我们知道它实际上不是
当 Linux 识别一个文件的时候,识别流程如下:
-
优先检查魔术数(Magic Number):
file首先会读取文件的前几个字节,查找是否匹配已知文件格式的魔术数(如 PNG、PDF、ZIP 等)。如果魔术数匹配,并且后续结构合理,立即判定为对应的格式文件。 -
结构校验: 如果魔术数匹配但文件结构异常(如缺失关键块),
file可能不会确认格式,而是退回为data类型,表示“无法识别但可能是二进制”。 -
未命中魔术数时执行内容分析: 如果没有识别出魔术数,
file会检查文件是否只包含可打印字符(ASCII 或 UTF-8)、是否有换行符、是否存在乱码等特征,以判断是否为文本文件,如ASCII text、UTF-8 Unicode text等。 -
最终默认类型为
data: 若既没有魔术数,也无法判定为文本,file会将该文件归类为data,表示其为原始的二进制或未知内容。
对着顺序再次查看之前的内容,就可以清晰的了解 Linux 是如何识别文件类型的了
部分信息可能已经过时