BUAA_OS lab0实验报告
一、思考题
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 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
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 -
处理完代码文件,你正打算去找小明说他的文件已经恢复了,但突然发现小明的仓库里有一个叫Tucao.txt,你好奇地打开一看,发现是吐槽操作系统实验的,且该文件已经被添加到暂存区了,面对这样的情况,你该如何设置才能使Tucao.txt在不从工作区删除的情况下不会被git commit指令提交到版本库?
编辑
.gitignore
文件,将Tucao.txt添加进去(可以用vim编辑)vim .gitignore
将暂存区的Tucao.txt删除
git rm Tucao.txt
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文件夹里乱改一弃,改错了直接把本地克隆的仓库扔进回收箱再次clone...或许在虚拟机上也可以这么干,但还不敢)。
很多命令经过亲自尝试的学习会发现记忆能更加深刻,我想这样大胆尝试的底气应该来自我对git能帮我回到完好无损(除了rm -rf(bushi))的相信,所以当务之急还是尽快熟悉Git关于“时空穿梭”的相关功能,还是要牢牢掌握基本工具的使用啊。
四、指导书反馈
在基础操作介绍
一节的最后位置,题目问到在已分屏窗口间切换的快捷键,在当时做题时一方面前两题排除了AB选项,另一方面教程中介绍了ctrl+b 0
的作用,于是理所当然选了C。但后来我才发现这一问中是小写o,检索发现原来ctrl+b o
也是一个有作用的快捷键。我认为在教程前面补上ctrl+b o
可以使教程更完备,或许也可以让同学们注意到这一点,而不是像我这样蒙混过关险些没有学到这一快捷键的作用。
五、残留难点
1.git的一个问题
在某次git add .
之后我试图用git status
查看哪些文件做了修改,但发现界面报出了这样的提示:
事实上在这之后每次都会有一长串这样的提示(尽管如此,正常的commit和push还能进行),我不知道这是否是因为我误删了什么东西,还是对.gitignore有了什么操作,这一问题到现在还没有得到解决(讨论区的问题并没有收到回复)。
2.Makefile的一个问题
在task8中需要makefile链接其他文件夹中的依赖文件,通过CSDN我了解到可以通过VPATH的设置使makefile自动在设置的目录中搜索依赖文件,于是在做题时我使用了VPATH=code:..\include
这样的路径,但程序报错“无法找到xxx文件”。我不知道这是什么原因,是用法出现了问题?还是对VPATH作用的理解有误?我还没有得到回答(同理,检索没有获得答案,讨论区也还没有得到对这个问题的回复)。
附上我检索到的VPATH用法: