Lab0 Report

Lab0 Report

思考题

Thinking 0.1

  • Untracked.txt:
1
2
3
4
5
6
7
8
9
位于分支 lab0
您的分支与上游分支 'origin/lab0' 一致。

未跟踪的文件:
(使用 "git add < 文件 >..." 以包含要提交的内容)
README.txt
Untracked.txt

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
  • Stage.txt:
1
2
3
4
5
6
7
8
9
10
11
位于分支 lab0
您的分支与上游分支 'origin/lab0' 一致。

要提交的变更:
(使用 "git restore --staged < 文件 >..." 以取消暂存)
新文件: README.txt
新文件: Untracked.txt

未跟踪的文件:
(使用 "git add < 文件 >..." 以包含要提交的内容)
Stage.txt
  • Modified.txt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
位于分支 lab0
您的分支领先 'origin/lab0' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)

尚未暂存以备提交的变更:
(使用 "git add < 文件 >..." 更新要提交的内容)
(使用 "git restore < 文件 >..." 丢弃工作区的改动)
修改: README.txt

未跟踪的文件:
(使用 "git add < 文件 >..." 以包含要提交的内容)
Modified.txt
Stage.txt

修改尚未加入提交(使用 "git add" 和 / 或 "git commit -a")
  • 从 Untracked 到 Stage,README 文件从未跟踪的文件变成要提交的文件,因为使用了 git add 进行跟踪,提交一次本地变更之后,再修改 README 时,README 不再是像第一次 status 中有一个新的没有跟踪的文件,而是有一个持续跟踪的发生变化的文件,所以两次 status 不一样。

Thinking 0.2

  • add the file: git add <file>

  • stage the file: add <file>

  • commit: git commit -m message

Thinking 0.3

  1. git checkout -- printf.c checkout 两种用法:切换分支,撤销修改(暂存区 -> 工作区)

  2. git reset --hard HEAD / git reset HEAD printf.c + git restore --staged printf.c

回退版本(仓库提交版本 -> 暂存区 / 工作区)

Thinking 0.4

  • 有三次提交

  • ```git commit ca2fac3c015bd8aded736d5f8e28a52cbc4d5bb5 (HEAD -> lab0) Author: 王子腾 Date: Thu Mar 2 11:38:26 2023 +0800

      3

    commit ecc063e495bc4ec11d625f120d85e845d63a42a8 Author: 王子腾 Date: Thu Mar 2 11:37:42 2023 +0800

      2

    commit c074c71ca4b2cb3b327c77807964fcc65c48ddc9 Author: 王子腾 Date: Thu Mar 2 11:36:29 2023 +0800

    1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    - 执行命令 git reset --hard HEAD^ 后,log中最上一条说明为 3 的提交消失

    - 找到提交说明为 1 的哈希值,执行命令 git reset --hard 后,log 中说明为 2 的提交消失

    - 再使用说明为3 的哈希值,执行 git reset --hard ca2fac3c015bd8aded736d5f8e28a52cbc4d5bb5 之后,直接回到那一次提交

    ### Thinking 0.5

    - echo first: 终端输出

    ```txt
    first

  • echo second > output.txt: output 中内容为

    1
    second

  • echo third > output.txt: output 中内容为

    1
    third

  • echo forth >> output.txt: output 中内容为

    1
    2
    third
    forth

Thinking 0.6

  • command
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
echo "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
1
2
3
3
2
1
  • a=1, b=2, c=$[$a+$b]使得 c=3。c,b,a 三个进入 file1,2,3,最后依次存入 file4,再存到 result

  • 执行echo echo Shell Startecho 'echo Shell Start'没有区别

  • 执行echo echo $c>file1echo 'echo $c'>file1有区别,不加引号时,$c 被认为是一个变量,但找不到值,没有显示。加引号时引号内整体被认定为字符串,全部写入 file1

难点分析

  • 引号,小括号,中括号语法混乱,Exercise 0.4 中替换语句中不可用‘ ’,只能用“ ”,因为单引号直接输出内部字符串,不解析特殊字符;双引号内则会解析特殊字符

    1
    sed -i "s/$2/$3/g" $1

  • Exercise 0.3 中 while 循环 [] 或者 (()) 表示条件,do done 为 while 循环区间。分支语法 if elif 与最后的 fi 结尾。

  • 参数运算语法,写自增

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    a=$[$b+$c] 
    c="expr $a+$b"
    let a++
    let a+=1
    ((a++))
    ["$a" \< "$b" ] 要带转义,条件表达式要放在方括号之间,并且要有空格,必须写成 [$a == $b ]
    在 [] 中使用的比较符:
    -eq =
    -ne !=
    -gt >
    -ge >=
    -lt <
    -le <=

  • Exercise 0.3 中根据 awk 语法需要临时创建一个文件保存待更改格式的内容(?

  • Exercise 0.4 中的.c 与.h 文件分别存放在两个文件夹,在链接的时候需要用 -I 给 gcc 起始搜索目录

  • Exercise 0.4 中的外层 make 调用内层 make 时

实验体会

Linux 下的各种功能更为清晰直接,提供了更多可设定参数,可以灵活编程用多种方法达到目的,并且借助一些正则表达式可以编写高效脚本。但同时大量功能和参数也使初期编写时记不清可用的功能和对应语法,导致没有头绪和大量 bug...