OS-Lab0实验报告
思考题
Thinking 0.1
Thinking 0.1 思考下列有关Git 的问题:
• 在前述已初始化的~/learnGit 目录下,创建一个名为README.txt 的文件。执行命令git status > Untracked.txt(其中的> 为输出重定向,我们将在0.6.3 中详细介绍)。
• 在README.txt 文件中添加任意文件内容,然后使用add 命令,再执行命令git status > Stage.txt。
• 提交README.txt,并在提交说明里写入自己的学号。
• 执行命令cat Untracked.txt 和cat Stage.txt,对比两次运行的结果,体会README.txt 两次所处位置的不同。
• 修改README.txt 文件,再执行命令git status > Modified.txt。
• 执行命令cat Modified.txt,观察其结果和第一次执行add 命令之前的status 是否一样,并思考原因。 根据题目要求执行命令,得到的
Untracked.txtStage.txtModified.txt如下。
$ cat Untracked.txt
位于分支 master
尚无提交
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
README.txt
Untracked.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
$ cat Stage.txt
位于分支 master
尚无提交
要提交的变更:
(使用 "git rm --cached <文件>..." 以取消暂存)
新文件: README.txt
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
Stage.txt
Untracked.txt
$ cat Modified.txt
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
修改: README.txt
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
Modified.txt
Stage.txt
Untracked.txt可以看到,新建文件后,文件处于未跟踪状态,git add后,文件加入暂存区,状态变为已暂存,执行git commit后,文件提交,状态变成未修改,再次修改后,文件变成已修改。
Thinking 0.2
Thinking 0.2
仔细看看0.10,思考一下箭头中的add the file、stage the file 和 commit 分别对应的是Git 里的哪些命令呢?
git add Untracked -> Staged # add the file
git commit Staged -> Unmodified # commit
Edit the file Unmodified -> Modified
git add Modified -> Staged # stage the file
Thinking 0.3
Thinking 0.3 思考下列问题:
代码文件print.c 被错误删除时,应当使用什么命令将其恢复?
代码文件print.c 被错误删除后,执行了git rm print.c 命令,此时应当使用什么命令将其恢复?
无关文件hello.txt 已经被添加到暂存区时,如何在不删除此文件的前提下将其移出暂存区?
git checkout -- print.c或git restore print.cgit reset HEAD print.c以撤销暂存区中的删除标记,git checkout -- print.c恢复git reset HEAD hello.txt
Thinking 0.4
Thinking 0.4 思考下列有关Git 的问题:
• 找到在/home/22xxxxxx/learnGit 下刚刚创建的README.txt 文件,若不存在则新建该文件。
• 在文件里加入Testing 1,git add,git commit,提交说明记为1。
• 模仿上述做法,把1 分别改为2 和3,再提交两次。
• 使用git log 命令查看提交日志,看是否已经有三次提交,记下提交说明为 3 的哈希值a。
• 进行版本回退。执行命令git reset –hard HEAD^ 后,再执行git log,观察其变化。
• 找到提交说明为1 的哈希值,执行命令git reset –hard
后,再执行git log,观察其变化。 • 现在已经回到了旧版本,为了再次回到新版本,执行git reset –hard
,再执行git log,观察其变化。
可以看到,进行三次提交后,git log输出了三次提交的信息,版本回退后,输出了2和1的信息,回退至1后,只输出1的信息,回退至3后,输出3、2、1的信息。
Thinking 0.5
Thinking 0.5 执行如下命令, 并查看结果
• echo first
• echo second > output.txt
• echo third > output.txt
• echo forth » output.txt
$ echo first
first
$ echo second > output.txt
$ cat output.txt
second
$ echo third > output.txt
$ cat output.txt
third
$ echo forth >> output.txt
$ cat output.txt
third
forthThinking 0.6
Thinking 0.6 使用你知道的方法(包括重定向)创建下图内容的文件(文件命名为test),将创建该文件的命令序列保存在command 文件中,并将test 文件作为批处理文件运行,将运行结果输出至result 文件中。给出command 文件和result 文件的内容,并对最后的结果进行解释说明(可以从test 文件的内容入手). 具体实现的过程中思考下列问题: echo echo Shell Start 与echo
echo Shell Start效果是否有区别; echo echo $c>file1 与echoecho $c>file1效果是否有区别.
# command
cat << 'EOF' > test
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
EOFchmod +x test
./test > result该文件计算了c=a+b并将三个变量分别保存至file1、2、3,并分别追加至file4末尾,最后将file4追加到result末尾。
echo echo Shell Start直接输出echo Shell Start,而echo `echo Shell Start`则是先执行后面的echo,并将结果echo,最终输出的是Shell Start。
同理,echo echo $c>file1会将echo (变量c的值)写入file1,而echo `echo $c>file1`则先将变量c的值写入file1,再将该命令的输出echo再屏幕上(也就是只有一个空行)。二者的区别在于file1中是否写入了echo。
难点分析
sed和awk命令的使用
在接触这两个命令之前,我从来不知道CLI也能有如此强大的文本分析工具,甚至很多功能是我以前觉得必须写一个小程序才能实现的。不过遗憾的是,由于这两个命令的功能过于强大,其操作也极其复杂,除了一些常用操作外,我似乎并不能得心应手的使用它们实现我想实现的功能。万幸的是,这是一个有AI的时代,我完全可以把我要实现的功能交给AI,让他帮我生成一条指令,而我只需要检查其正确性即可。
Vim
久仰Vim的大名,但是碍于其命令行工具的身份,我一直对其望而却步。由于上机环境不保证提供vs code,甚至电脑里没有安装ssh,所以我不得不学习使用Vim。尽管现在只学会了插入、保存、退出,但是在代码量不大的时候已经完全够用,而且随着对CLI的熟悉,我认为上手其他的快捷键也不是什么难事。
Shell脚本语法
之前一直以为Shell脚本有什么难的,不就是把命令堆叠在一起嘛。直到真的去写,才发现他的好些语法是如此的神奇,比如if [ condition ]不能少的空格啦(询问AI得知,[其实是/bin/[命令,所以他和后面的参数之间必须有空格),等号前后不能有空格啦,等等等等。虽说脑子里需要一点时间去适应,但是毕竟只是语法嘛,我相信总能接受的。
实验体会
上机相关
今年lab0上机的题量较去年有很大的减少(感谢助教!!!),让本来抱着做完exam就跑路的想法的我有了碰extra的机会。虽然整体不难,但还是有几点想分享。
- 及时保存!由于此次上机的特殊情况,跳板机整体断连好几次,第一次的时候由于不知道,就导致了代码没有保存就消失殆尽。(这不能怪平时用vs code自动保存习惯了嗯对)所以后面就学乖了,敲完一点就Esc+:w,管他这那的,先保存一发。
- 善用提示!对于extra的最后一个要求(实现一个复杂的文件内容的索引排序),本来想可能要用复杂的我不会用的awk命令,索性直接放弃,写完前面做好测试打算交了,突然意识到提示中好几个命令没用到且不可能在前面的要求中用到,而且后面给的提示模版也写到“综合使用提示命令”,才明白那几条提示就是用来完成这个的。不过那几条命令我没有用过,不确定他具体的使用方法和效果如何,于是我就在命令行里一点一点试,到这一步正确了,再管道接下一个命令。于是就这么一点一点试出来了,尽管未必是最简单的写法。最终的命令如下:
awk '{print $1}' "$acc_src" | sort | uniq -c | sort -nr | awk '{print $2,$1}' > "$sum_dst"Ghostty——Mac本地终端分享
对于使用Mac/Linux的同学,我真的要分享这款颜值超高的第三方终端:Ghostty。说实话,在此之前,我一直使用的都是Mac内置的Terminal,虽然他又黑又丑,但是毕竟大部分操作我都会在IDE里完成,真的用Terminal的时候可能也就是用homebrew安装个软件,或者临时执行一些命令。但是OS课,我决定使用SSH连接远程主机,并在本机无缝完成任务的时候,我就意识到,是时候换个终端了。我曾倾心过老牌终端iTerm2,但是其臃肿的性能又把我劝退——我哪里需要那么多的功能,还要以启动速度作为代价。于是我选择了开源社区新兴产品Ghostty,在功能强大的同时,其使用了GPU加速和系统原生框架,所以其启动速度很快。而且他内置了左右上下分屏的功能,这让我在刚刚学会tmux的时候,就决定放弃了tmux(嘿嘿)。下面贴出截图和我的配置,欢迎大家照抄~

command = /bin/zsh -l -i
# 基础调用
font-family = "JetBrains Mono"
font-style = "ExtraBold"
font-size = 16
font-thicken = true
# 1. 背景透明度 (0.0 到 1.0)
# 推荐 0.85 到 0.95 之间,既能看到背景,又不会干扰文字阅读
background-opacity = 0.97
# 2. 模糊半径 (数值越大越模糊,高斯效果越明显)
background-blur-radius = 30
# 3. 移除窗口边框(让毛玻璃效果更通透)
# macos-titlebar-style = hidden
# 4. 呼吸感:调整行高和字符间距
# 增加 15% 的行高能让 C 语言复杂的指针嵌套看起来更清晰
adjust-cell-height = 15%
adjust-cell-width = 0%
# 5. 留白:增加窗口内边距
window-padding-x = 15
window-padding-y = 15
theme = TokyoNight Storm
# 避免ssh时远程终端的字体配色在本地无法渲染
term = xterm-256color