OS_lab0_实验报告
1. 思考题
==不一样==。在第一次 git add 之前文件 README.txt 属于未跟踪的文件,此时 git 是无法管理这个文件的,因此 git status 显示未跟踪的文件;而在 git add 并 git commit 之后,git 开始管理这个文件,此时再修改后其状态就会变成已修改未暂存的文件。==其根本原因就是 git 是否管理了这个文件==。如果 git 不管理这个文件,那么这个文件的状态一直都是 untracked ,一旦 git 管理了这个文件,那么经过修改后就会变成 changes not staged for commit ,git add 之后就都是 changes to be committed。
图中,add the file 对应指令 git add,stage the file 对应指令 git add,commit 对应 git commit。
当删除了 print.c 后,可以用 git restore print.c / git checkout – print.c 进行恢复至上一次commit的状态。当删除了 print.c 并执行了 git rm print.c 后,可以用 git reset HEAD print.c / git restore – staged print.c 先取消暂存,再用 git restore print.c / git checkout – print.c 恢复工作区的更改。可以用 git reset HEAD hello.txt / git restore –staged hello.txt 将其在不删除的前提下移出暂存区。
在执行 git reset –hard HEAD^ 后,HEAD 指向了上一次 commit 的分支,并且刚刚的分支在 git log 中消失了。在执行 git reset –hard hash 后,HEAD 指向了该 hash 所对应的分支。再执行 git reset –hard hash3 后,HEAD 又指向了最新的分支,并且之前再 git log 中消失的分支又出现了。
输入完 echo first 之后,shell中会输出first。 输入echo second >output.txt 后,会创建output.txt 文件,并在其中写入second。输入完echo third > output.txt 之后,会覆盖原有的output.txt 文件内容,并写入third。输入完echo forth >> output.txt 之后,会在原有的文件后追加forth。
command文件内容如下:
result文件内容如下:
说明如下:
利用赋值语句 a=1,b=2进行赋值操作。再通过 $a 和 $b 取出ab中的值,进行重新赋值给c,此时c=1+2=3。通过save to 语句分别把c,b,a写入file1,2,3中。再利用>>重定向把file1,2,3的内容追加到file4中,最后把file4的内容重定向追加到result中。
思考:
echo echo Shell Start 和 echo ` echo Shell Start ` 有区别。前者会将echo后的内容输出到终端。后者会优先执行引号内的内容,即先输出Shell Start,再将输出结果作为内容执行echo语句,最终输出Shell Start。
echo echo $c>file1 和 echo `echo $c>file1 ` 有区别。前者会将echo $c 重定向写入file1中。后者会先执行引号内的内容,即先将 $c 重定向写入file1中,由于输出被重定向所以返回空串,外层echo再输出空串到终端。
2. 难点分析
sed的使用。sed是一个强大的文本编辑工具,想要熟练使用sed需要大量练习。当需要输出时,要加上-n选项,例如:sed -n ‘1p’ file。当需要真正对文本进行改变的时候,需要加上-i选项,例如:sed -i ’1d’ file。同时如果要进行传参替换操作,则需要用双引号,例如:sed ”s/$1/$2/g” file。
bash脚本的编写。在脚本第一行需要加上#!/bin/bash语句。进行赋值语句时,等号两边不能加空格,例如:a=1。if语句格式为:
if condition
then
command
fi
while语句格式为:
while condition:
do
command
done
其中condition为一条返回真值的语句,用中括号[]包裹。通过 -eq -ne -gt -lt -ge -le 等判断大小关系返回真值,例如:[$(a) -ge 100]find命令可以在目录中查找文件名。grep命令可以查找文件中特定pattern的行数,例如 grep -n int file。配合awk命令可以分割语句并根据条件打印相应值。
Makefile是很强大的工具。如果不写make则默认执行第一个target。Makefile格式如下:
target:dependencies
command
执行make target即可根据dependencies和command生成所需文件。dependencies可以有多个,如何dependencies不存在,则会优先生成dependencies,再生成target。如果在当前目录中想要调用子目录中的make指令,可以在makefile中输入make -C dir,这样等同于cd dir,并输入make。
3. 实验体会
- OS的概念很多,需要记忆的东西也很多,因此需要花很多时间在基础操作的熟悉和练习上,只有熟练掌握基本操作,学习之后的知识才能得心应手。同时需要在做题的过程中认真体会,细心留意,注意一些小的细节,例如gcc -I可以更改头文件地址等等。
- 必要时需要查阅资料,问问大模型,例如如何在子目录中调用make指令,需要make -C dir命令,这些太过细节的知识不宜查找,所以需要善用大模型帮助我们学习。
- 有时候需要自行探索,例如执行一条命令后没有反应,可能是多种原因导致的,需要自己不断试错找到原因。比如传参需要用双引号“”包裹起来,想要打印$字符需要前面加转义\。
4. 原创说明
本实验报告所有内容均为原创。