BUAA_OSlab0实验报告
⼀、思考题
1.思考0.1
通过你的使⽤经验,简单分析 CLI Shell,GUI Shell 在你使⽤过程中的各⾃优劣(100 字以内)
CLI:优点:界⾯简洁;编写程序⽅便;⽆需加载图形等内容性能更⾼;只需要键盘就能实现所有功能,对外部设备要求低;批量操作时更⽅便(rm -rf/)。缺点:学习成本⾼;有时⽆法直观看到操作结果;界⾯单调。
GUI:优点:界⾯美观且更直观;可以直接看到操作结果(⽐如删除⽂件);⼊门门槛低;可配合多种外设使⽤。缺点:运⾏效率较低;稳定性较差。
2.思考0.2
使⽤你知道的⽅法(包括重定向)创建下图内容的⽂件(⽂件命名为test),将创建该⽂件的命令序列保存在command⽂件中,并将test⽂件作为批处理⽂件运⾏,将运⾏结果输出⾄result⽂件中。给出command⽂件和result⽂件的内容,并对最后的结果进⾏解释说明(可以从test⽂件的内容⼊⼿)具体实现的过程中思考下列问题:echo Shell Start 与
echo 'Shell Start'效果是否有区别;echo $c>file1 与 echo '$c>file1' 效果是否有区别
command⽂件内容:
echo echo > 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
test⽂件中$字符⽤于引⽤变量,如 c=$[$a+$b]中,取a和b的值相加后赋值给c。在echo c时输出字符c,⽽echo $c时则输出c的值。
echo Shell Start与echo 'Shell Start'执⾏效果没有区别,均是输出字符串;echo \$c>file与echo '\$c>file1'执⾏效果不同,前者是输出字符串$c到file1,⽽后者是在窗⼝中显⽰字符
串\$c>file1。
3.思考0.3
仔细看看这张图,思考⼀下箭头中的 add the file 、stage the file 和commit 分别对应的是 Git ⾥的哪些命令呢?
add the file对应git init
stage the file对应git add
commit对应git commit
4.思考0.4
深夜,⼩明在做操作系统实验。困意⼀阵阵袭来,⼩明睡倒在了键盘上。等到⼩明早上醒来的时候,他惊恐地发现,他把⼀个重要的代码⽂件printf.c删除掉了。苦恼的⼩明向你求助,你该怎样帮他把代码⽂件恢复呢?
从暂存区中回该⽂件
git checkout -- printf.c
正在⼩明苦恼的时候,⼩红主动请缨帮⼩明解决问题。⼩红很爽快地在键盘上敲下了git rm printf.c,这下事情更复杂了,现在你⼜该如何处理才能弥补⼩红的过错呢?
将最近⼀次commit版本中的该⽂件拉取到暂存区,之后再从暂存区回该⽂件
git reset HEAD --printf.c
git checkout --printf.c
处理完代码⽂件,你正打算去⼩明说他的⽂件已经恢复了,但突然发现⼩明的仓库⾥有⼀个叫,你好奇地打开⼀看,发现是吐槽操作系统实验的,且该⽂件已经被添加到暂存区了,⾯对这样的情况,你该如何设置才能使在不从⼯作区删除的情况下不会被git commit指令提交到版本库?
编辑.gitignore⽂件,将添加进去(可以⽤vim编辑)
vim .gitignore
将暂存区的删除
git
5.思考0.5
思考下⾯四个描述,你觉得哪些正确,哪些错误,请给出你参考的资料或实验证据。
克隆时所有分⽀均被克隆,但只有HEAD指向的分⽀被检出。
克隆出的⼯作区中执⾏ git log、git status、git checkout、git commit等操作不会去访问远程版本库。
正确。
克隆时只有远程版本库HEAD指向的分⽀被克隆。
正确。
克隆后⼯作区的默认分⽀处于master分⽀。
正确。
依据来⾃Git官⽹:
Clones a repository into a newly created directory, creates remote-tracking branches for each branch in the cloned repository (visible using git branch --remotes), and creates and checks out an initial branch that is forked from the cloned repository’s currently active branch.
—— Git官⽹
⼆、实验难点
1.task5
task5中要求将⽂件批量重命名,⼀开始我想到了rename命令但不会使⽤,于是到CSDN搜索⽤法,按照提⽰尝试写出命令(与题⽬要求不完全相同)
i=1
while [ $i -le 70]
do
rename file newfile ./file$i
let i+=1
done
但并不能运⾏,可能是因为./file$1被当作了正则表达式匹配,后来换成./file/$i,'./file$i', "./file$i"都不⾏,遂放弃。
后来发现可以直接使⽤ mv命令实现重命名(把原⽂件重命名后作为新⽂件移动到原⽬录)
然⽽⼜发现变量⾃增不会写,于是通过CSDN了解到五种变量⾃增⽅法:
i='expr $i + 1'      #注意i与=之间不能有空格,$i + 1三者之间必须有空格
let i+=1
((i++))
i=$[$i+1]
i=$(($i + 1))
2.task8
本题难点在于⽂件产⽣的相互依赖与逻辑,我的思路如下图:
我认为可以逆向思考,要在csc⽂件夹中获得fibo⽂件,Makefile中的⽬标即为fibo,⽽依赖为fibo.o和main.o,但这两个⽂件应该位于code⽂件夹中,于是⼆者的产⽣逻辑均为进⼊code⽂件夹,然后make编译产⽣..o⽂件,此处也要注意产⽣.o⽂件时还需要依赖code⽂件夹的兄弟⽂件夹include中的fib.h头⽂件。
本题的另⼀个难点在于“链接”,当在⼀个⽂件夹中编译时需要调⽤某不在此⽂件夹中⽂件,此时需要告诉编译器去哪⾥到这个⽂件。⽐如在最后⽣成fibo⽂件时需要code⽂件夹中的两个.o⽂件,此时这两个.o⽂件应带有相对路径,否则⽆法到。
csc⽂件夹中Makefile:
all:fibo
fibo:fibo.o main.o
gcc -o fibo code/fibo.o code/main.o
fibo.o main.o:
cd code && make
PHONY:clean
clean:
cd code && make clean
code⽂件夹中Makefile:
all: fibo.o main.o
fibo.o:fibo.c fibo.h
gcc -c -I ../include fibo.c  #包含头⽂件
main.o:main.c fibo.h
gcc -c -I ../include main.c
.PHONY:clean
clean:
rm fibo.o main.o
三、体会与感想
本次作业耗时约9⼩时(主要是学习新内容),尽管寒假学习了vim和⼀些基本的命令⾏操作,但事实上还有更多我没有见过的东西,做作业的时候有种连滚带爬的感觉,基本上是靠着CSDN苟活下来的。
⽐如grep、sed之类的命令,感觉确实很有体系,但经常记不住什么命令什么选项什么参数放在哪⾥,或许还是应该多加练习,希望熟能⽣巧。
也可能是因为在虚拟机上,不能直观地看到想要的东西,⽽且不太熟悉Git的相关操作,也就不敢过于放肆地尝试(⽐如在Windows系统上我就可以⼤胆地在git⽂件夹⾥乱改⼀弃,改错了直接把本地克隆的仓库扔进回收箱再次或许在虚拟机上也可以这么⼲,但还不敢)。
很多命令经过亲⾃尝试的学习会发现记忆能更加深刻,我想这样⼤胆尝试的底⽓应该来⾃我对git能帮我回到完好⽆损(除了rm -rf(bushi))的相信,所以当务之急还是尽快熟悉Git关于“时空穿梭”的相关功能,还是要牢牢掌握基本⼯具的使⽤啊。
四、指导书反馈
在基础操作介绍⼀节的最后位置,题⽬问到在已分屏窗⼝间切换的快捷键,在当时做题时⼀⽅⾯前两题排除了AB选项,另⼀⽅⾯教程中介绍了ctrl+b 0的作⽤,于是理所当然选了C。但后来我才发现这⼀问中是⼩写o,检索发现原来ctrl+b o也是⼀个有作⽤的快捷键。我认为在教程前⾯补上ctrl+b o可以使教程更完备,或许也可以让同学们注意到这⼀点,⽽不是像我这样蒙混过关险些没有学到这⼀快捷键的作⽤。
五、残留难点
1.git的⼀个问题
在某次git add .之后我试图⽤git status查看哪些⽂件做了修改,但发现界⾯报出了这样的提⽰:
makefile phony事实上在这之后每次都会有⼀长串这样的提⽰(尽管如此,正常的commit和push还能进⾏),我不知道这是否是因为我误删了什么东西,还是对.gitignore有了什么操作,这⼀问题到现在还没有得到解决(讨论区的问题并没有收到回复)。
2.Makefile的⼀个问题
在task8中需要makefile链接其他⽂件夹中的依赖⽂件,通过CSDN我了解到可以通过VPATH的设置使makefile⾃动在设置的⽬录中搜索依赖⽂件,于是在做题时我使⽤
了VPATH=code:..\include这样的路径,但程序报错“⽆法到xxx⽂件”。我不知道这是什么原因,是⽤法出现了问题?还是对VPATH作⽤的理解有误?我还没有得到回答(同理,检索没有获得答案,讨论区也还没有得到对这个问题的回复)。
附上我检索到的VPATH⽤法:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。