BUAA_OS_Lab0 实验报告
我才知道图片还需要一个个复制到编辑栏里面...
一.实验思考题
thinking0.1
使用 cat Modified.txt ,观察它和第一次 add 之前的 status 一样吗,思考一 下为什么? (对于Thinking 0.1,只有这一小问需要写到课后的实验报告中)
不一样。其中 Untracked.txt
文件里面的内容显示的是Untracked files:README.txt
,其中Untracked表示这个是新增的文件,在工作区之前并没有出现过。而
而Modified.txt文件显示的内容为Changes not staged for commit: modified: README.txt
,他表示文件内容已经修改,但还没有git add
提交
Thinking 0.2
add the file
表示从未跟踪到未修改,文件最开始为未跟踪状态,也就是新创建了文件,如果想把它存到git中并能进行编辑和上传,对应着对操作应为git add <filename>
stage the file
表示从已修改到已暂存,它是把工作区已经修改的文件进行提交到暂存区,所以对应的指令为git add <filename>
commit
表示从暂存到未修改,他表示暂存区的文件提交了之后文件内容更新,所以是未修改状态,对应指令为git commit
Thinking 0.3
深夜,小明在做操作系统实验。困意一阵阵袭来,小明睡倒在了键盘上。等到小明早上醒来的时候,他惊恐地发现,他把一个重要的代码文件printf.c删除掉了。苦恼的小明向你求助,你该怎样帮他把代码文件恢复呢?
恢复删除的文件(未git add)
,使用git checkout -- printf.c
即可恢复删除的文件
正在小明苦恼的时候,小红主动请缨帮小明解决问题。小红很爽快地在键盘上敲下了git rm printf.c,这下事情更复杂了,现在你又该如何处理才能弥补小红的过错呢?
git rm printf.c
将工作区与暂存区的printf.c
文件都删除了,如果想要撤回文件的话,需要先使用git reset HEAD printf.c
将暂存区更新,然后再次git checkout -- printf.c
即可恢复删除的文件
处理完代码文件,你正打算去找小明说他的文件已经恢复了,但突然发现小明的仓库里有一个叫Tucao.txt,你好奇地打开一看,发现是吐槽操作系统实验的,且该文件已经被添加到暂存区了,面对这样的情况,你该如何设置才能使Tucao.txt在不从工作区删除的情况下不会被git commit指令提交到版本库?
使用git rm --cached Tucao.txt
可以在暂存区删去内容而不影响到工作区。
Thinking 0.4
每次提交一次都会保存一个新的历史记录,此历史记录可以用git log
查看,其中git reset --hard HEAD^
表示当前指针指向的上一个记录,也就是指向了第二次提交2,此时再次git log
会显示第二次提交即之前提交记录,如果想再回到第三次提交位置,则记录下第三次提交的版本号, git reset --hard <Hash-Code>
即可
Thinking 0.5
思考下面四个描述,你觉得哪些正确,哪些错误,请给出你参考的资料或实验证据。
1.克隆时所有分支均被克隆,但只有HEAD指向的分支被检出。
2.克隆出的工作区中执行 git log、git status、git checkout、git commit等操作不会去访问远程版本库。
3.克隆时只有远程版本库HEAD指向的分支被克隆。
4.克隆后工作区的默认分支处于master分支。
本人在gitlab上创建了一个新的项目,又创建了一个新的分支222,此时,两个分支文件都是REAMDE.md
,但文件的内容不同
此时git clone ssh
,本地上显示了REAMDE.md
文件,在main分支里面显示的文件内容为
,此时git checkout
到222分支,里面的文件内容显示为
因此1正确,3.错误
而在执行2中操作时,查看git lab
远程库明没有发现文件内容有变化。2正确
4.当克隆远程仓库后,使用git branch
命令查看当前分支,显示的内容为
此时显示文件分支在默认分支(本人git lab远程仓库默认的分支为main)
因此,1.2.4正确,3错误
Thinking 0.6
执行如下命令,并查看结果*
echo first
echo second > output.txt
echo third > output.txt
echo forth >> output.txt
在终端中执行命令显示如下:
Output文件内容显示如下:
解析:echo 为显示文字,执行第一条语句时,显示文字first在直接在终端上。第二条语句后面加了>,表示输出重定向到output.txt中,此时若没有该文件则会自行创建,并且会将原来文件里面的内容删除,重新添加内容。因此,第三条语句输出的third会将第二条语句内容覆盖。而>>重定向为向文件里面追加内容,因此不会把原本文件里面的内容删除,因此最后文件内容为third,forth。
Thinking 0.7
使用你知道的方法(包括重定向)创建下图内容的文件(文件命名为test),将创建该文件的命令序列保存在command文件中,并将test文件作为批处理文件运行,将运行结果输出至result文件中。给出command文件和result文件的内容,并对最后的结果进行解释说明(可以从test文件的内容入手). 具体实现的过程中思考下列问题: echo echo Shell Start
与 echo 'echo Shell Start'
效果是否有区别; echo echo $c>file1
与 echo 'echo $c>file1'
效果是否有区别.
Command文件内容如下:
运行command文件终端显示如下
Result文件内容如下
结果解析:test文件本身只是生成图中内容,相当于一个脚本文件生成了另一个脚本文件。在command文件中执行如下代码时,echo后面的字符是输出到终端页面上的(除了特殊操作,例如重定向>)。因此终端页面上会生成解释信息,而真正执行运算的代码只有=赋值命令、cat或echo与重定向结合的文本内容输入。因此a=1,b=2,c=$[1+2],将结果分别输入到file1.2.3上,再统一输入到file4中,file4文件内容输入到result文件中就形成于此。
echo echo Shell Start 与 echo 'echo Shell Start'效果无区别:输出结果如下,这是因为echo没有和其他指令结合时只会输出echo后面的命令。
echo echo $c>file1 与 echo 'echo $c>file1'效果有区别.
可以看到,echo echo \(c>file1因为与>重定向结合,会将\)c内容输出到file1文件中,此时echo判断echo $c字符串的内容为echo 和c的赋值。而加上’’表示一整个整体为字符串,且’’表示不会进行转义。
二、实验难点图示
我遇到困难的地方最多之处在exercise0.4,由于初学shell语言,很多语言未完全掌握,导致进度受阻且操作繁琐。
三、体会与感想
难点实验为课上的extra题目,我认为难度级在这些lab0中的实验中考前,在课上花费了将近一个小时。而它给我体会感想最深的是我自己对于语言的掌握程度,诚然,在课下练习的时候我由于语法只是储备的不足导致推进速度缓慢,而再经过一番学习之后,我自认为在某种程度上已经掌握,但在做额外练习的时候,我一方面因为sed语法的使用如何将文件修改内容输出的错误理解,另个一方面我又因为如何创造可执行文件的输入而陷入了卡顿。在这两个方面我通过实验指导书进行了细致的学习,才明白自己的理解有误,并且了解了自己掌握语法其实并不熟练,还需多加练习。