lab0 实验报告 [BUAA-OS]
Part1. 思考题
Thinking 0.1 Git相关
执行以下命令
1 | cd ~/learnGit # 已初始化的git仓库 |
status 是否一样,并思考原因。
结果不同。第一次执行
git add前,README.txt是一个未被跟踪的文件,而在修改已经提交的README.txt文件后,Git 已经开始跟踪该文件,只是当前修改尚未被添加到暂存区,与未跟踪状态不同。
Thinking 0.2 Git命令

箭头中的add the file、stage the file和commit分别对应的是Git里的哪些命令呢?
add the file对应的是
git add命令,用于将未跟踪文件添加到暂存区(Untracked->Staged)。
stage the file对应的是git add命令,用于将已跟踪但被修改的文件添加到暂存区(Modified->Staged)。
commit对应的是git commit命令,用于将暂存区的文件提交到版本库(Staged->Unmodified)。
Thinking 0.3 Git版本
代码文件print.c被错误删除时,应当使用什么命令将其恢复?
使用
git checkout -- print.c命令或者git restore <file>命令撤销对print.c文件的删除操作。
代码文件print.c被错误删除后,执行了git rm print.c命令,此时应当使用什么命令将其恢复?
使用
git restore --staged print.c命令恢复print.c文件的未暂存状态,然后使用git restore print.c命令恢复print.c文件的未修改状态。
无关文件hello.txt已经被添加到暂存区时,如何在不删除此文件的前提下将其移出暂存区?
使用
git restore --staged hello.txt命令将hello.txt文件从暂存区移出。
Thinking 0.4 Git reset
执行以下命令,并观察变化。
1 | > cd learnGit/ |
使用
git reset HEAD...版本回退,上版本是^,上上版本是^^,以此类推,也可以使用~n表示回退到上n次提交。注意git reset --hard本身是危险的,因为它会重写git的提交历史,覆盖掉之前的写入(Testing 1, Testing 2, Testing 3),如果还未提交,则无法恢复。
Thinking 0.5 关于重定向
执行以下命令,并查看结果
1 | > echo first |
通过上面的命令,可以非常直观地观察到,
>是覆盖写入,>>是追加写入。
Thinking 0.6 关于echo
创建下图内容的文件,命名为test,将创建该文件的命令序列保存在command文件中,并将test文件作为批处理文件运行,将运行结果输出至result文件中。给出command文件和result文件的内容,并对最后的结果进行解释说明(可以从test文件的内容入手). 具体实现的过程中思考下列问题: echo echo Shell Start 与 echo echo Shell Start 效果是否有区别; echo echo $c>file1与echo echo $c>file1 效果是否有区别.
1 | #in file command |
运行test脚本,结果
1 | # in file result |
结果解释:
在test文件中,
echo命令会将后面的内容输出到终端,因此会逐行输出echo后的内容,脚本的功能是将a赋值为1,b赋值为2,c赋值为a+b,在将c,b,a依次存储到file1,file2,file3中,最后将file1,file2,file3的内容依次追加输入到file4中,再追加到result文件中,因此result文件中的内容为3,2,1。
关于echo echo Shell Start 与 echo echo Shell Start 效果是否有区别; echo echo $c>file1与echo 'echo $c>file1' 效果是否有区别
由于带上单引号后会直接输出字符串,
echo echo Shell Start与echo 'echo Shell Start'最终都将输出Shell Start,效果无区别。对于echo echo $c>file1与echo 'echo $c>file1',由于echo echo $c>file1将输出echo $c>file1,其中$c=3,因此file中为3,而echo 'echo $c>file1'将直接输出字符串echo $c>file1到终端,而$c作为参数为空,是因此file中为空,但echo自带换行符,因此file中为空行。
Part2. 难点分析

Exercise 0.1
- 判断回文数,主要考察在CLI中编辑以及其它基本的操作指令,程序本身问题不大。
- 考察了刚刚学习的make命令和MakeFile的编写,生成可执行文件也是基本的gcc命令。
- 考察编写shell脚本,需要掌握sed命令和shell脚本中参数的使用,提取需要使用重定向,最后实现
sed -n 'kp' $1 >> $2,需要注意sed命令中的参数。 - 复制到指定文件夹需要使用
cp命令,难度不大。
Exercise 0.2
- 写一个简单的shell脚本,实现批处理,需要掌握循环的写法,循环变量自加的写法比较有意思(
i=$(i+1)/let i=i+1)。
Exercise 0.3
- 题目是多种指令的结合使用,还考察了管道指令。查找可以用
grep -n实现,将行号与内容分离需要掌握awk指令,其中参数-F分隔符与{print $1}需要掌握含义。管道指令与重定向可以实现执行多步操作并将结果输出到文件中。
Exercise 0.4
- 字符串替换可以很容易想到使用
sed "s/old/new/g" "$inputfile",注意参数为双引号,否则单引号会保留字符串而非实际含义,需要加上g全局替换,以及加上-i参数,否则不会直接修改文件,而是输出到终端。 - MakeFile的编写有更高要求,需要注意头文件需要自己链接,以及编译得到可执行文件的路径。
Part3. 实验体会
lab0的主要题目要求都是基于OSpre的部分,需要我们学习使用命令行操作,这对很多同学来说是初次实践,但一旦掌握了pre和指导书中对于Git,Shell,gcc,MakeFile的介绍,以及勤搜索、多实践,完成难度不会太大,而实现之后也会发现,命令行操作拥有许多便利之处,在此不再一一列举。
对我而言,通过此次lab0的课下实践,我对于make、sed、awk、shell脚本的掌握有了一定的提升。
Part4. 原创说明
阅读了hugo学长的难点分析,对于从GUI到CLI的转变有了更深理解。






![lab6 实验报告 [BUAA-OS]](https://gitee.com/TheUHO/blog/raw/master/images/202409111007685.jpg)