BUAA OS LAB0 实验报告

Thinking

Thinking 0.1

Q:

• 在前述已初始化的~/learnGit 目录下,创建一个名为 README.txt 的文件。执 行命令git status > Untracked.txt(其中的 > 为输出重定向,我们将在 0.6.3 中 详细介绍)。
• 在README.txt 文件中添加任意文件内容,然后使用 add 命令,再执行命令 git status > Stage.txt。 • 提交README.txt,并在提交说明里写入自己的学号。
• 执行命令cat Untracked.txt 和 cat Stage.txt,对比两次运行的结果,体会 README.txt 两次所处位置的不同。
• 修改README.txt 文件,再执行命令git status > Modified.txt。
• 执行命令cat Modified.txt,观察其结果和第一次执行 add 命令之前的 status 是 否一样,并思考原因。

A:

分别处于未追踪,待提交

commit后处于已提交的状态,status里不可见

修改后处于尚未暂存但已修改,未add前未追踪,因此会显示未追踪,add后进行追踪,再进行修改,因此处于尚未暂存但已修改。

Thinking 0.2

Q:

仔细看看0.10,思考一下箭头中的add thefile、stage thefile和 commit分别对应的是Git里的哪些命令呢?

A:

add the file–>git add
stage the file–>git add
commit–>git commit

Thinking 0.3

Q:

1.代码文件print.c被错误删除时,应当使用什么命令将其恢复?

2.代码文件print.c被错误删除后,执行了gitrmprint.c命令,此时应当 使用什么命令将其恢复?

3.无关文件hello.txt已经被添加到暂存区时,如何在不删除此文件的前提下 将其移出暂存区?

A:

1
2
3
git checkout-- print.c
git reset --hard HEAD print.c
git restore --staged print.c

Thinking 0.4

Q:

•找到在/home/22xxxxxx/learnGit下刚刚创建的README.txt文件,若不存 在则新建该文件。
•在文件里加入Testing 1,gitadd,gitcommit,提交说明记为1。
•模仿上述做法,把1分别改为2和3,再提交两次。
•使用gitlog命令查看提交日志,看是否已经有三次提交,记下提交说明为 3的哈希值a。
•进行版本回退。执行命令gitreset—hardHEAD^后,再执行gitlog,观 察其变化。
•找到提交说明为1的哈希值,执行命令gitreset—hard后,再执 行gitlog,观察其变化。
•现在已经回到了旧版本,为了再次回到新版本,执行gitreset—hard ,再执行git log,观察其变化。

A:

9fe0cdd55bc867b9e813479b5e3a0fb132430656

git log每次只会显示其所在位置前的日志。

Thinking 0.5

Q:

观察以下操作结果
• echo first
• echo second > output.txt
• echo third > output.txt
• echo forth >> output.txt

A:

输出到屏幕first

输出到output second

覆盖output third

追加output forth

Thinking 0.6

Q:

使用你知道的方法(包括重定向)创建下图内容的文件(文件命名为test), 将创建该文件的命令序列保存在command文件中,并将test文件作为批处理文件运行,将 运行结果输出至result文件中。给出command文件和result文件的内容,并对最后的结 果进行解释说明(可以从test文件的内容入手). 具体实现的过程中思考下列问题: echo echo Shell Start 与 echo echo Shell Start 效果是否有区别; echo echo $c>file1 与echo echo $c>file1 效果是否有区别.

A:

command

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

1
2
3
3
2
1

test中变量设置为a=1,b=2c=3

之后分别存入file1,file2,file3

然后利用cat指令将其顺序输入file4

1
echo Shell Start
1
echo `echo Shell Start`

两者完全相同

1
echo echo $c>file1
1
echo `echo $c>file1`

第一个实现将echo $c>file1输出

第二个实现输出echo $c>file1的结果

lab0难点

T1

命令参数的读入,读入后的引用,makefile初步,复制指令的使用

T2

Shell的循环执行,目录的创建和删除

T3

grep 的匹配 -n输出行号

awk实现分割输出,或利用sed正则匹配

grep -n “$2” “$1” |awk -F: ‘{print $1}’ >”$3”

T4

make -C code all

-C 实现打开子目录code的子makefile

gcc -I../include -c fibo.c -o fibo.o

-I../include实现跨目录头文件引入

实验体会总结

本次实验较为简单,主要是为之后的实验熟悉操作,这里列出了一些常用经验作为实验总结。

1.ehco

输出中有字母和符号(不包含变量)时需要用引号包含

2.文件操作

用vim编辑完成后,按 ESC进行输入:

:wq 保存并退出

:q! 强制退出不保存

:e! 放弃所有修改

3.批处理

1)新建一个文件

touch test.sh

2)在里面编写脚本

1
2
#!/bin/sh
......

3)执行

./test.sh 或source test.sh 或bash/sh test.sh

4.单引号、双引号与反引号

1)双引号能够识别变量;单引号是不能识别变量,只会原样输出

2)双引号能够实现转义(类似于“*”);只会原样输出,单引号是不能转义的

3)当在脚本中需要执行一些指令并且将执行的结果赋给变量的时候需要使用“反引号”

5.可执行文件的理解

c语言的编译过程分为:预处理,编译,汇编,链接

所处阶段 执行操作 生成文件 指令
预处理 展开头文件/宏替换/去掉注释/条件编译 .i gcc -E
编译 检查语法,生成汇编 .s gcc -S
汇编 汇编代码转换机器码 .o gcc -c
链接 链接到一起生成可执行程序 .out gcc *.o

6.git

git restore —staged file=将暂存返回到工作区

git restore file =git checkout — file =恢复文件为上一次保存的add的状态

git reset HEAD撤销暂存(本质是恢复暂存区为该提交初始状态)