OS-Lab0

Foolish-Han Lv2

Lab0 实验报告

思考题

Thinking 0.1

执行命令 cat Modified.txt,观察其结果和第一次执行 add 命令之前的 status 是否一样,并思考原因。

第一次执行 add 命令之前
修改 README.txt 之后

不一样。

第一次执行 add 命令之前,README.txt 属于未跟踪的文件。

修改 README.txt 之后,README.txt 属于已跟踪,但修改未加入到暂存区中的文件。

Thinking 0.2

仔细看看0.10,思考一下箭头中的 add the file 、 stage the file 和 commit 分别对应的是 Git 里的哪些命令呢?

add the file: git add

stage the file: git add

commit : git commit

Thinking 0.3

1. > 代码文件 print.c 被错误删除时,应当使用什么命令将其恢复?

1
git checkout -- print.c

2. > 代码文件 print.c 被错误删除后,执行了 git rm print.c 命令,此时应当使用什么命令将其恢复?

1
git reset HEAD print.c

3. > 无关文件 hello.txt 已经被添加到暂存区时,如何在不删除此文件的前提下将其移出暂存区?

1
git rm --cached hello.txt

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 效果是否有区别.

command 文件内容:

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
echo "echo Shell Start..."
echo "echo set a = 1"
echo "a=1"
echo "echo set b = 2"
echo "b=2"
echo "echo set c = a+b"
echo "c=\$[\$a+\$b]"
echo "echo c = \$c"
echo "echo save c to ./file1"
echo "echo \$c>file1"
echo "echo save b to ./file2"
echo "echo \$b>file2"
echo "echo save a to ./file3"
echo "echo \$a>file3"
echo "echo save file1 file2 file3 to file4"
echo "cat file1>file4"
echo "cat file2>>file4"
echo "cat file3>>file4"
echo "echo save file4 to ./result"
echo "cat file4>>result"
}

把 command 作为批处理文件运行得到 test:

1
bash command > test

test 文件内容:

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
echo Shell Start...
echo set a = 1
a=1
echo set b = 2
b=2
echo set c = a+b
c=$[$a+$b]
echo c = $c
echo save c to ./file1
echo $c>file1
echo save b to ./file2
echo $b>file2
echo save a to ./file3
echo $a>file3
echo save file1 file2 file3 to file4
cat file1>file4
cat file2>>file4
cat file3>>file4
echo save file4 to ./result
cat file4>>result

把 test 作为批处理文件运行得到 result:

{.line-numbers}
1
2
3
4
5
6
7
8
9
10
11
12
13
Shell Start...
set a = 1
set b = 2
set c = a+b
c = 3
save c to ./file1
save b to ./file2
save a to ./file3
save file1 file2 file3 to file4
save file4 to ./result
3
2
1

echo echo Shell Start 与 echo echo Shell Start 效果是否有区别

在实际效果上,二者并无区别,都是输出Shell Start到标准输入。

但前者是直接通过echo命令输出,后者是先执行` `内的命令echo Shell Start,并将标准输出的结果Shell Start作为参数传给` `外的命令echo

echo echo $c>file1 与 echo echo $c>file1 效果是否有区别

有区别:

前者是将echo与变量c的值拼接起来,输出到文件file1当中;

后者是先执行echo $c>file1命令,即将变量c的值输出到文件file1中,同时将标准输出的结果作为参数传给` `外的命令echo,而标准输出的结果实际上为空,` `外的命令echo将没有任何效果。

难点分析

Exercise 0.1

0.1.1

对于回文数判断,最直接的思路应该是得到整数对应的高位和低位,依次进行比较,但这样未免繁琐,需要考虑整数的位数。这种思路只关注了回文数形式上的特征。
而另一种简洁的思路是不关注单独的每一位,而是尝试把整数倒转过来,通过对判断前后是否相等直接得到结果。这种思路无疑是把握了回文数的本质。

{.line-numbers}
1
2
3
4
5
while(n){
q=q*10+n%10;
n/=10;
}
if (s==q)

0.1.3

通过 shell 脚本实现对文本的处理,能够按行选择性读取文本的 sed 指令显然是个很好的选择,把输出重定向即可按照要求创建文件(注意覆盖写即可)

1
sed -n '8p; 32p; 128p; 512p; 1024p' "$1" > "$2"

Exercise 0.2

0.2.1

注意取变量的值时需要加上 $ 符号,对变量赋值时可采用 let(不用加 $ ) 或 (())(需要加 $ 取值),但都要注意 = 两边不能有空格。

Exercise 0.3

0.3.1

使用 grep 命令来在文件中匹配字符串,通过 -n选项使输出的行带上行号(行号与行之间以 : 分隔)。

通过管道 | 将输出的结果作为参数传给 awk 指令。

使用 -F: 选项将传入的字符串按照 : 分隔,同时使用 {print $1} 方法打印分割后的第一个字符串(即行号)。

通过输出重定向将结果输出到文件中。

Exercise 0.4

0.4.1

使用 sed 指令时,注意加上 -i 选项使得可以直接修改文件。使用正则表达式进行替换时,注意加上 /g 使得可以匹配全部的项(否则只是每行第一个)

0.4.2

使用 gcc 编译时,应注意到 fibo.cmain.c 引用的头文件并不在标准库中,应使用 -I 选项指定头文件目录。同时注意到 main.c 作为程序的入口调用了 fibo.c 中的函数,应把二者放在一起编译链接。

实验体会

熟能生巧!熟能生巧!熟能生巧!

lab0实验作为 OS 实验的铺垫环节,旨在帮助我们掌握深入理解基本概念,灵活运用各种工具,其本身并无多大难度。

面对繁杂的指令,可能会认为有参考就不需要太多的记忆。但事实上对各种指令的记忆正是灵活运用的一部分。

在需要时去查看指导书固然不错,但这种情况下我们往往只会机械地照搬示例指令,而不能以更好地方式去运用指令,同时会消耗大量时间在不必要的事情上(记忆错误debug、提笔忘字查refer)。

熟稔于心是灵活运用的前提。从某种程度上说,指令就是一个个穴位,只有打通任督二脉,才能练就绝世武功。