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 Startecho 'Shell Start'执行效果没有区别,均是输出字符串;echo \$c>fileecho '\$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

思考下面四个描述,你觉得哪些正确,哪些错误,请给出你参考的资料或实验证据。

  1. 克隆时所有分支均被克隆,但只有HEAD指向的分支被检出。

  2. 克隆出的工作区中执行 git log、git status、git checkout、git commit等操作不会去访问远程版本库。

    正确。

  3. 克隆时只有远程版本库HEAD指向的分支被克隆。

    正确。

  4. 克隆后工作区的默认分支处于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用法:

 

posted @ 2021-06-28 10:30  菠菜白菜花菜  阅读(907)  评论(2编辑  收藏  举报