写在前面
道阻且长,行则将至。
2025年开学快乐!
正式开学前,OSpre已经不自觉地进入我的脑子里(对...对吗),pre中的篇幅较大,涉及方面较多,特为2025OSpre写一份复习总结,主要体现一些指导书的难点与自己的思考。:D
初识Linux系统
以前我对Linux系统的了解仅仅止步于会简单地操作与使用,本次预习的内容让我在Linux更加从容自在地学习、运用。下面来看一下我们学到了什么新要点吧~
Linux基础操作
文件操作
在 Linux 的哲学下一切皆文件,包括目录、设备等等全部是以文件方式存在于操作系统中的。因此 文件操作 的对象为所有一版文件(包括目录)。
命令 | 用法 | 作用 |
---|---|---|
touch | touch [选项] 文件名 | 当文件存在时更新文件的时间戳,当文件不存在时创建新文件。 |
rm | rm [选项] 文件 | 删除文件。 |
cp | cp [选项] 源文件 目标路径 | 将源文件(也可以是目录)复制为目标路径对应的文件(如果目标路径是文件)或复制到目标路径(如果目标路径是目录)。 |
mv | mv [选项] 源文件 目标路径 | 将源文件(也可以是目录)移动为目标路径对应的文件(如果目标路径是文件)或移动到目标路径(如果目标路径是目录)。 |
diff | diff [选项] 文件1 文件2 | 对两个文件进行比较操作。 |
其中选项作为一个非必需的指令部分却也有着很重要的用处,可以提供丰富的功能同时,也会带来一定的风险。如rm -r
为递归删除目录及其内容,rm -f
为强制删除目录,cp -r
为递归复制目录中的所有内容。值得一提的是,mv
指令无需附加选项-r
即可直接完成对目录下所有内容的移动。
对于编辑文件内部,我们使用的工具是Vim这款开源文本编辑器,教程说这是一款编辑效率极高的编辑器,给人一种功能强大的感受。篇幅有限,放上官方的Vim教程推荐供参考:https://coolshell.cn/articles/5426.html
查找操作
查找操作中涉及两个相似但不相同的指令:find
和
grep
。下面给出指令对比:
命令 | 用法 | 作用 |
---|---|---|
find | find [路径] <选项> | 在给定路径下递归地查找文件,输出符合要求的文件的路径。如果没有给定路径,则在当前目录下查找。 |
grep | grep [选项] PATTERN FILE | 输出匹配PATTERN的文件和相关的行。 |
实用工具介绍
GCC(GNU Compiler Collection,GNU 编译器套件)
虽然GCC的用法相当简单,但其中的步骤相当复杂,即从源代码到执行文件,步骤图示如下:

上图中展示了从源代码到执行文件的四个步骤:预处理→编译→汇编→链接,而现实中GCC为我们将这些程序封装起来降低了我们操作的复杂度。
make & Makefile
make是最常用的C语言项目构建工具之一,可将文件编译链接成可执行文件,基本格式如下:
1 | target: dependencies |
其中的dependencies
文件是必填的,如果不写却在下面的某command
中使用到,可能会导致奇怪的编译错误。运行时,下面的command
会在make target
后显式地在shell中执行相应的命令,换句话说,所有的command
都是shell
语句,大胆地写就OK,唯一需要注意的是每个command
前面必须有一个Tab
,否则也会导致出错。
值得一提的是,下面是教程举的栗子:
1 | all: hello |
实际上,这里的all
也只是一个target的名称,它的效果其实是执行后续的其他target,并没有其他的特殊意义,甚至可以用其它字符串替换,而将它放置在hello
前,使得在这种情况下,以下三种命令是等价的:
1 | make |
tmux(Terminal multiplexer)
终端复用神器。
使用时需要用Ctrl + B
做快捷键引子(表格以*代称),常用操作如表格所示:
快捷键 | 效果 |
---|---|
* + % | 左右分屏 |
* + " | 上下分屏 |
*+Up/Down/Left/Right | 切换窗格 |
* + Space | 变换布局 |
* + x | 关闭窗格 |
* + d | 分离对话 |
当我们分离离开tmux后,可以使用下述代码返回:
1 | tmux ls # 查询tmux的Num |
此外,笔者在tmux中遇到无法滚动页面的问题,实际上需要使用Ctrl + B +[
即可进入滚动页面。
关于Shell脚本
Shell脚本执行
1 | touch hello.sh # 创建新文件hello.sh |
其中值得注意的是Linux系统中文件并没有后缀一说,因此.sh
作为文件类型的标识符也是文件名的一部分,与前面不可分割。在编辑脚本的过程中,我们需要首先指定脚本的解释器,如Bash。
1 | !/bin/bash |
Bash Shell 语法基础
1.变量
Shell本身是弱类型语言,定义普通变量时无需声明变量类型,此外还有脚本参数这种特殊的变量,用于从脚本外部传递参数,如$1
、$2
,以及$#
与$*
两种特殊变量,分别代表传递参数个数以及传递的全部参数,下面笔者用部分代码体现参数的特性:
1 | shel1.sh |
2.条件与循环语句
if
语句块格式如下:
1 | if condition1 |
while
语句块格式如下:
1 | while condition |
3.函数的定义与调用
函数的定义如下:
1 | function fun_name() { # function与()可选一省略 |
内容编辑和选择输出的自动化
sed
与awk
的使用
对于sed
指令,我理解为可以在shell中直接操作的“Vim”,提供了添加、删除、替换等功能,即可解放双手!实现编辑与输出的自动化!
下面具体举一些笔者实战用的比较多的用法:
1 | 用法:sed [选项] '命令' 输入文本 |
这里值得注意的是,如果这句话在shell中包含形参出现需要打单引号保护参数,即:
1 | modify.sh |
此外令笔者印象深刻的是,在Lab0
实验的hello_os.sh
的题目中,要求将某文件的某几行输出到另一个文件中,题目的要求是8,32,128,512,1024行,笔者这里
想要偷懒
写成一行代码,却老是导致错误,最后唯一的正确写法如下:
1 | sed -n -e '8p' -e '32p' -e '128p' -e '512p' -e '1024p' $1 > $2 |
另一方面,便是在教程中略带神秘感的awk
指令,感兴趣的读者可以前往官方教程,这里笔者只拿Lab0的题目举例,展现其分割的作用:
1 | !/bin/bash |
重定向与管道
其实在上文的不少代码中都有重定向的身影,我认为sed/awk+重定向
简直是文件之间的直通车,可以在彼此间交换各种信息,非常的方便快捷,对于自动化大有帮助。对于重定向而言,需要注意两点:
>
其实是1>
的简写,意为标准输出,如果想输出标准错误请使用2>
>
在实际操作中会先把重定向的目标清空,所以无法在重定向符号前后自引用,会发现什么都没有了,此外,如果想在目标文件中追加输出,请使用追加重定向,即>>
。
而对于管道,它的用法更加直接,但是应用面较窄,形式为:
1 | command1 | command2 | command3 | ... |
其中,|
即为管道,意思是将前一个command
的输出,输入到后一个command
的标准输入中。
给人的感觉是重定向的高阶用法,实际上也正是如此,所有管道都可以用重定向表示,对于上述的命令,我们可以用下述重定向平替:
1 | command3 < <(command2 < <(command1)) |
后记
不经一番寒彻骨,怎得梅花扑鼻香。 愿大家都能趁着自己一股心劲儿,在年轻的时候想做什么就做什么,谋事在人,成事在天,谋且试之,久练则成!
If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !