BUAA-OS lab0实验报告,关于Linux的基础,shell脚本编程,git的知识,Makefile项目管理
lab0实验报告
实验思考题
Thinking 0.1
Thinking 0.1 思考下列有关 Git 的问题:
• 在前述已初始化的 ~/learnGit 目录下,创建一个名为 README.txt 的文件。执行命令 git status > Untracked.txt。
• 在 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 是否一样,并思考原因。
- 在刚开始第一个
git status
时,效果如下,但是因为我已经将README.txt文件提交过了,所以并不在未跟踪的文件里 - 添加内容进readme中然后
git add README.txt
,此时文件在状态为Staged,位置在暂存区(而若已修改未提交则应该在工作区),下一步是commit - 已修改未提交的文件则应该在工作区,状态为Modified,我们仍需要用
git add README.txt
将其更新。
Thinking 0.2
Thinking 0.2 仔细看看0.10,思考一下箭头中的 add the file 、stage the file 和 commit 分别对应的是 Git 里的哪些命令呢?
- add the file: 用
git add
将未跟踪的文件添加进暂存区,状态Staged - stage the file: 用
git add
将已修改的文件加入缓存区,状态也是Staged - commit: 用
git commit
将暂存区内容提交储存区,文件不在暂存区,回到了Unmodified状态。
Thinking 0.3
Thinking 0.3 思考下列问题:
1.代码文件 print.c 被错误删除时,应当使用什么命令将其恢复?
2.代码文件 print.c 被错误删除后,执行了 git rm print.c 命令,此时应当使用什么命令将其恢复?
3.无关文件 hello.txt 已经被添加到暂存区时,如何在不删除此文件的前提下
将其移出暂存区?
- 只是删除了工作区的print.c文件,可以使用
git checkout -- print.c
将其从暂存区拉回。 - 而删除后再执行
git rm print.c
指令会将其从暂存区中也删除,但是我们能将其从版本库中再次找回- 使用
git reset HEAD
将暂存区重置到与上一次commit一致,然后与上面操作一致。 - 也可以使用
git checkout HEAD print.c
使得分支中的文件直接替换工作区以及暂存区的文件。
- 使用
- 无关文件hello.txt在暂存区中,我们可以通过
git rm --cached hello.txt
将其在暂存区删除,而不改变本地文件。- 也可以使用
git rm -f hello.txt
将其强制都删除(暂存区and工作区
- 也可以使用
Thinking 0.4
Thinking 0.4 思考下列有关 Git 的问题:
• 找到在/home/21xxxxxx/learnGit 下刚刚创建的 README.txt 文件,若不存
在则新建该文件。
• 在文件里加入 Testing 1,git add,git commit,提交说明记为 1。
• 模仿上述做法,把 1 分别改为 2 和 3,再提交两次。
• 使用 git log 命令查看提交日志,看是否已经有三次提交,记下提交说明为
3 的哈希值a。
• 进行版本回退。执行命令 git reset —hard HEAD^后,再执行 git log,观
察其变化。
• 找到提交说明为 1 的哈希值,执行命令 git reset —hard < hash> 后,再执
行 git log,观察其变化。
• 现在已经回到了旧版本,为了再次回到新版本,执行 git reset —hard < hash>
,再执行 git log,观察其变化。
- 我们可以在下面的图看到过程,收获就是版本回退的时候,版本库中的新版本并没有消失,因为我们还能够再通过hashCode回到新版本。
- HEAD代表当前版本,HEAD\^代表上一个版本,HEAD\^\^代表上两个版本,以此类推。
Thinking 0.5
Thinking 0.5 执行如下命令, 并查看结果
• echo first
• echo second > output.txt
• echo third > output.txt
• echo forth >> output.txt
Thinking 0.6
Thinking 0.6 使用你知道的方法(包括重定向)创建下图内容的文件(文件命名为 test),将创建该文件的命令序列保存在 command 文件中,并将 test 文件作为批处理文件运行,将运行结果输出至 result 文件中。给出 command 文件和 result 文件的内容,并对最后的结果进行解释说明(可以从 test 文件的内容入手). 具体实现的过程中思考下列问题:
echo echo Shell Start 与 echo ‘echo Shell Start’效果是否有区别; echo echo
$ c > file1 与 echo ‘echo $c>file1’效果是否有区别.
- 要创造test文件里的这些命令,需要将每一条命令都使用echo指令,输出到test文件中
- 大致的指令如下:
echo "echo Shell Start..."
用双引号引起来。然后运行command脚本,即可得到一个test文件 - 然后我们运行test文件,通过命令内容我们可以知道脚本的功能是将a,b赋值为1,2让c=a+b然后将cba的值依次存到file123中,然后将file123的值输入到file4中,然后将file4的值输入到result中,所以result的结果会是1,2,3
- 大致的指令如下:
- 关于加引号与不加引号的区别,在第一对命令之间没有区别。
- 而第二对命令中,不加引号的会按照语法执行这个命令,将echo $c输入到file1文件里。带单引号的将会将引号内的内容当作字符串原封不动的输出在标准输出中。若要想让$c变量发挥作用,则应该使用双引号””
难点分析
Exercise 0.1
- 第一问就不难了,大一C语言基础题
- 第二问:
target
是palindrome
,demand
是palindrome.c
我们需要写的就只有一个指令gcc palindrome.c -o palindrome
- 第三问:因为是输出指定行的操作,我们可以使用sed,输出指定内容的选项是’-n’,然后输出第k行,输入为AAA文件,重定向到BBB,我们可以使用
sed -n 'kp' AAA > BBB
指令。- 但注意AAA BBB是脚本的传入参数,所以在文件中用
$1 $2
表示 - 再另外因为是覆盖,所以我们使用
>
而不是>>
- 但注意AAA BBB是脚本的传入参数,所以在文件中用
- 复制操作就不多说
Exercise 0.2
- 涉及到脚本编程的循环结构
1 | i=start_num |
- 两个操作都可以这么去做
Exercise 0.3
- 根据题目的提示,我们可以使用
grep -n
指令进行查找并显示行号,用awk
实现分离行号输出 - 也要注意文件名查找词作为参数输入。
- 因为
grep
的输出作为awk
的输入,我们可以使用管道指令。
1 | grep -n $2 $1 | awk -F: '{print $1}' > $3 |
Exercise 0.4
- 第一问是字符串替换,我没很容易能够想到使用
sed
指令,但有许多需要注意的地方- 比如我们能够想到
's\reg\str'
的命令实现替换,但是我们需要用到's\reg\str\g'
,如果不加g则只会替换每行第一个匹配。 - 输入
sed 's\char\int\g $1'
到脚本,运行,然后发现根本没换,这里有个问题,就是在脚本文件中,单引号’’代表纯字符串,所以没有功能性,我们在这里需要用双引号””- 可以试试在脚本中
echo '$1'
和echo "$1"
的输出来对比。
- 可以试试在脚本中
- 最后输入
sed "s\$2\$3\g $1"
发现文件没有变化,原因是忘了sed -i
- 比如我们能够想到
- 第二问有几个难点,一点是Make的循环调用
- 主要用到
make -C
的方法,以及我们也可以使用make clean -C
- 但是我打好码之后发现了报错,fibo.h的头文件没有找到,因为他在
../include
里所以我们需要gcc链接的指令gcc -I 路径
- 最后,关于清除所有的.o文件,我们可以采用路径的通配符
*.o
- 主要用到
实验体会
- lab0主要考察了关于git、Makefile、gcc、shell常用命令及脚本编程的基础,我认为考察还是十分全面的,收获满满。
- 暂时不太可能记住很多的命令,所以需要学会自己查资料,要善于man指令或者—help的帮助。
- 另一点我觉得一定要细心且规范,遵照着规矩来,计算机没有二义性。
- 明白了c语言转化为可执行文件的底层原理
- 学会了使用gcc的命令编译c语言文件
- 更加了解了git的使用,对其中的操作的原理也有了更多的理解
- 学会了一个项目的Makefile的写法,相当于是掌握了一门新的工具了
- 最后就是觉得对于操作系统文件系统运行的原理有了一定的接触和感受(作为用户及程序员的角度)。Linux里Everything is files。
- 暂时不太可能记住很多的命令,所以需要学会自己查资料,要善于man指令或者—help的帮助。