北航操作系统课程lab0实验报告

OS lab0实验报告

实验思考题

Thinking0.1

使用 cat Modified.txt ,可以观察到它和第一次 add 之前的 status 不一样。

在第一次git add之前,README.txt文件仍然处于工作区中,未处于Stage中,没有被跟踪,所以也不是一个已修改的文件。而在使用git add之后并修改文件内容时,该文件已被跟踪,只是没有将最新的更新添加进去,所以Stage中没有这个最新版本的README.txt文件,会显示该文件已修改。

Thinking0.2

下箭头中的 add the file 、stage the file 和 commit 分别对应的是 Git 里的git add、git add、git commit。

Thinking0.3

(1)执行下述代码

 git checkout printf.c

(2)执行下述代码

 git reset HEAD printf.c
 git checkout printf.c

(3)在.gitignore中添加下述代码,然后再次执行git commit

 /mtk/Tucao.txt

Thinking0.4

git reset能够实现版本回溯功能,并且通过HEAD能够回到以前的某个版本,十分便捷。但在回溯到以前的版本后,想要再回到之后的版本操作就稍微有点麻烦,不能根据HEAD直接返回,只能通过键入hash值来定位以前的版本。而值得一提的是,版本回溯到过去时,git log查看版本历史记录并不能看到最新一版的版本内容信息,hash值貌似只能从未回溯时的git log进行查看。这意味着如果我们还想再反悔,想重新回到最新一版的内容时,必须要在回溯之前记住该版本的hash值。

回溯到过去十分容易,但想要再进到未来就得需要在回溯时明确自己是否有这个需求。在笔者看来,这样增加继续回溯的代价的目的,是让我们在进行每一次版本回溯前都要提前想清楚,确保自己的有用的文件一定不存在丢失额可能性,慎用撤销指令。可能的一种明智的做法是,通过创建一个新的分支来保存当前版本避免以后亡羊补牢。

Thinking0.5

1、错误,git clone只能克隆远程仓库的默认HEAD指向的分支(一般是master分支),而如果不使用git checkout的话,则没有分支被检出。(好像可能是所有分支都被克隆,只是不会被检出,这部分的概念理解的有点模糊)

2、正确,这四个命令都只在本地库当中进行。

3、正确,git clone默认克隆HEAD指向的分支。

4、正确

Thinking0.6

结果如上所示

Thinking0.7

command文件内容:

 echo 'echo Shell Start...' > test
 echo 'echo set a=1'>>test
 echo 'a=1'>>test
 echo 'echo set b=2'>>test
 echo 'b=2'>>test
 echo 'echo set c=a+b'>>test
 echo 'c=$[$a+$b]'>>test
 echo 'echo c=$c'>>test
 echo 'echo save c to ./file1'>>test
 echo 'echo $c>file1'>>test
 echo 'echo save b to ./file2'>>test
 echo 'echo $b>file2'>>test
 echo 'echo save a to ./file3'>>test
 echo 'echo $a>file3'>>test
 echo 'echo save file1 file2 file3 to file4'>>test
 echo 'cat file1>file4'>>test
 echo 'cat file2>>file4'>>test
 echo 'cat file3>>file4'>>test
 echo 'echo save file4 to ./result'>>test
 echo 'cat file4>>result'>>test

result文件内容:

 3
 2
 1

解释说明:echo命令里的参数可以是加了单引号、双引号和反引号。加单引号表明忽略所有特殊字符,直接原封不动的输出引号内内容。加双引号表明会对特殊符号(例如$,\)进行特殊解析、字符转义,当看到颜色变化时,表明已经进行了解析,输出的字符可能会与引号内的字符串本身不同。加反引号表明直接将引号内容当做一条指令,输出其标准输出。在test中,定义了a、b、c三个变量,其中a=1,b=2,c=a+b。分别存进file1,file2,file3中。再讲三个文件中的内容依次重定向到file4中,最后再将file4中内容存到result中。每一步过程都对应着在命令行输出的英文解释。

实验难点展示

本次实验主要是了解bash脚本编写,Makefile编写,gcc编译器,vim编辑器部分功能和git的使用。vim编辑器感觉暂时用不到高级功能,而git的使用已在OO课程中学过。

bash脚本编写

其主要操作是新建一个.sh文件,并用vim编辑器编写,最后给予这个文件可执行的权限并用bash脚本运行。大致流程如下:

 touch newBash.sh
 vim newBash.sh
 #start to write
 chmod +x newBash.sh
 bash newBash.sh

值得一提的是脚本内容的编写可以用到很多实用的命令

 grep - print lines matching a pattern 
 用法:grep [选项]... PATTERN [FILE]... 
 选项(常用): 
 -a 不忽略二进制数据进行搜索 
 -i 忽略文件大小写差异 
 -r 从文件夹递归查找 -n 显示行号
 ​
 diff [选项] 文件 1 文件 2
 常用选项
 -b 不检查空格字符的不同
 -B 不检查空行
 -q 仅显示有无差异,不显示详细信息
 ​
 sed
 sed [选项] ‘命令’输入文本
 选项(常用): 4 -n: 使用安静模式。在一般 sed 的用法中,输入文本的所有内容都会被输出。
 加上 -n 参数后,则只有经过 sed 处理的内容才会被显示。
 -e: 进行多项编辑,即对输入行应用多条 sed 命令时使用。
 -i: 直接修改读取的档案内容,而不是输出到屏幕。使用时应小心。
 命令(常用): 9 a : 新增, a 后紧接着\\,在当前行的后面添加一行文本
 c : 取代, c 后紧接着\\,用新的文本取代本行的文本
 i : 插入, i 后紧接着\\,在当前行的上面插入一行文本
 d : 删除,删除当前行的内容
 p : 显示,把选择的内容输出。通常 p 会与参数 sed -n 一起使用。
 s : 取代,格式为 s/re/string,re 表示正则表达式,string 为字符串,
 功能为将正则表达式替换为字符串。
 ​
 awk [选项]  '指令'  操作文件
 常用选项:-F  指定分隔符,分隔符用""引起来
 -v:var=value在awk程序开始之前指定一个值value给变量var,这些变量值用于awk程序的BEGIN快
 -f:后面跟一个保存了awk程序的文件,代替在命令行指定awk程序
 在awk中使用正则匹配,正则表达式必须要放在//中
 awk '/123/{print}'  1.txt   #打印1.txt中匹配123的那一行内容

Makefile编写

Makefile基本格式:

 target: dependencies
     command 1 
     command 2 
     ...
     command n

在shell中输入make target(目标名)就能够执行相应的命令。缺省输入make的话,会自动执行Makefile文件中第一个指令。Makefile的嵌套是一个难点。

export VALUE1 := export.c    #<-- 用了 export, 此变量能够传递到 子目录 中
VALUE2 := no-export.c        #<-- 此变量不能传递到 子目录 中

#override =
#override :=
#override +=
#其中 = 和 := 的区别在于, := 只能使用前面定义好的变量, = 可以使用后面定义的变量
#变量追加值 += 作用是使 Makefile中定义的变量能够覆盖 make 命令参数中指定的变量

subsystem:
    cd subdir && $(MAKE)
clean:
	$(MAKE) --directory=subdir clean

gcc编译器

语法:gcc [选项]... [参数]...
选项(常用):
-o 指定生成的输出文件
-S 将 C 代码转换为汇编代码
-Wall 显示最多警告信息
-c 仅执行编译操作,不进行链接操作
-M 列出依赖
-include filename 编译时用来包含头文件,功能相当于在代码中使用 #include<filename> 
-Ipath 编译时指定头文件目录,使用标准库时不需要指定目录,-I 参数可以用相对路径,比如头文件在当前目录,可以用-I. 来指定
参数:
C 源文件:指定 C 语言源代码文件
e.g.

$ gcc test.c
# 默认生成名为 a.out 的可执行文件
#Windows 平台为 a.exe

$ gcc test.c -o test
# 使用-o 选项生成名为 test 的可执行文件
#Windows 平台为 test.exe

可直接将多个文件进行编译连接:gcc testfun.c test.c -o test ,也可以 先使用-c 选项将每个文件单独编译成.o 文件,再用-o 选项将多个.o 文件进行连接:gcc -c testfun.c -> gcc -c test.c -> gcc testfun.o test.o -o test ,两者等价。 在此过程中,要用-o指定生成的文件名,否则会生成默认的名为a的可执行文件。这里的选项参数顺序是可以改变的可以先写-o,再写-c。一般而言,在编写较大文件时,头文件.h和.c文件不在同一个文件夹中,若.c文件中include没有给出头文件的相对路径,这时就要使用-I <filepath>来指定头文件文件夹,否则编译无法通过。

体会与感想

lab0实验本身是很简单的。对于笔者最主要的难点在于新工具的适应。学会了Makefile,vim以及git的基本操作,但对其高级操作还是不太感冒,一是没有太多时间去学习并应用,二是这些高级操作在现在的lab中可能效果并不明显,譬如貌似只会vim中的insert模式就足以使我存活下来了。

本实验中花费我时间最多的部分是shell脚本命令了。一方面是shell的基础语法和命令,这部分感觉在指导书上没有详讲,另一方面是重定向、管道与这些命令的结合,可能还是对命令的各参数不太熟悉吧。

在以后的时间会逐步去探索一些这些工具,因为现在还不能做到熟练掌握类似像awk这样的文本分析工具。

posted @ 2022-03-26 22:45  南风北辰  阅读(739)  评论(0编辑  收藏  举报