BUAA-OS Lab0

日期:
標籤: BUAA-OS 1

lab0

Lab 0 主要就是一個 Makefile 和 Linux shell 的練習。你可以從這裡獲取今年實驗的公開指導書截至發稿時的版本,存於網際網路檔案館)。

練習題

Exercise 0.1

好久沒寫 C。雖然連 palindrome 都不會寫了,但是好像懂得比以前多了很多)

剩下 3 問沒什麼難度。唯須注意的是:

[Makefile 中] 有一點尤為需要注意,每一個命令 (command) 之前必須用一個製表符(Tab)縮排。這裡必須使用製表符而不能是空格,否則 make 會報錯。

考試的時候被坑了。

Exercise 0.2

Shell 的條件和迴圈。

a=1
while [ $a -le 100 ]
do
        if [ $a -gt 70 ]
        then
                rm -r "file$a"
        elif [ $a -gt 40 ]
        then
                mv "file$a" "newfile$a"
        fi
        # ((a++))
        a=$((a+1))
        # don't forget change the loop variable
done

Exercise 0.3

# First you can use grep (-n) to find the number of lines of string.
# Then you can use awk to separate the answer.
 
grep -n "$2" "$1" | cut -d: -f1 > "$3"

cut -d 後面是分隔符,-f1 是第一個欄位,即行號。

Exercise 0.4

./csc/code/modify.sh
sed -i "s|$2|$3|g" "$1"

需要 include 標頭檔案。

./csc/code/Makefile
all:
        bash modify.sh fibo.c char int
        gcc -c fibo.c main.c -I../include
思考题Thinking 0.1Git 的使用 1执行命令 cat Untracked.txtcat Stage.txt,对比两次运行的结果,体会 README.txt 两次所处位置的不同。对比两者的输出,可以看到 README.txtUntracked files 列表中移动到Changes to be committed 列表中。执行命令 cat Modified.txt,观察其结果和第一次执行 add 命令之前的 status 是否一样,并思考原因。当前的 status 显示 README.txt 处于 “Changes not staged for commit” 并且是 modified 状态,这意味着在 README.txt 被添加到暂存区之后内容又被修改了,但修改还没有被添加到暂存区。Thinking 0.2箭头与命令图 1 Git 中的四种状态转换关系仔细看看图 1,思考一下箭头中的 add the file、stage the file commit 分别对应的是 Git 里的哪些命令呢?add the filestage the file 对应的是 git add 命令;commit 对应的是 git commit 命令。Thinking 0.3Git 的一些场景1.代码文件 print.c 被错误删除时,应使用什么命令将其恢复?git checkout print.cShell2.代码文件 print.c 被错误删除后,执行了 git rm print.c 命令,此时应当使用什么命令将其恢复?git restore print.cShell3.无关文件 hello.txt 已经被添加到暂存区时,如何在不删除此文件的前提下将其移出暂存区?git reset hello.txtShellThinking 0.4Git 的使用 21.使用 git log 命令查看提交日志,看是否已经有三次提交,记下提交说明为 3 的哈希值。538d89392bb30646faeaf5823be2f16006f5fe881.进行版本回退。执行命令 git reset --hard HEAD^ 后,再执行 git log观察其变化。HEAD^ 代表当前的前一个版本(提交 2)。git log 观察提交记录,3 版本的提交会消失。1.找到提交说明为 1 的哈希值,执行命令 git reset --hard 后,再执行 git log,观察其变化。当前 HEAD 指向了版本 1。1.现在已经回到了旧版本,为了再次回到新版本,执行 git reset --hard再执行 git log,观察其变化。发现 3 版本恢复,版本历史回到了最新状态。Thinking 0.5echo 的使用git@2xxxxxxx ~# echo firstShellfirstgit@2xxxxxxx ~# echo second > output.txtgit@2xxxxxxx ~# cat output.txtsecondgit@2xxxxxxx ~# echo third > output.txtgit@2xxxxxxx ~# cat output.txtthirdgit@2xxxxxxx ~# echo forth >> output.txtgit@2xxxxxxx ~# cat output.txtthirdforthgit@2xxxxxxx ~#>stdout 写入到文件中,如果文件不存在则创建,如果文件存在则覆盖,相当于 fopen()wwrite)模式;>>stdout 追加到文件中,如果文件不存在则创建,如果文件存在则追加,相当于 fopen()aappend)模式。Thinking 0.6文件的操作使用你知道的方法(包括重定向)创建下图内容的文件(文件命名为 test),将创建该文件的命令序列保存在 command 文件中,并将 test 文件作为批处理文件运行,将运行结果输出至 result 文件中。给出 command 文件和 result 文件的内容,并对最后的结果进行解释说明(可以从 test件的内容入手)。testShell1echo 'echo Shell Start...2echo set a = 13a=14echo set b = 25b=26echo set c = a+b7c=$[$a+$b]8echo c = $c9echo save c to ./file110echo $c>file111echo save b to ./file212echo $b>file213echo save a to ./file314echo $a>file315echo save file1 file2 file3 to file416cat file1>file417cat file2>>file418cat file3>>file419echo save file4 to ./result20cat file4>>result' > commandcommandShell132231435261具体实现的过程中思考下列问题:1.echo echo Shell Startecho `echo Shell Start` 效果是否有区别;2.echo echo $c>file1echo `echo $c>file1` 效果是否有区别。1.echo echo Shell Start 会输出 echo Shell Start,而 echo `echo Shell Start` 会输出 Shell Start。这是因为被 ` ` 包围的字符串会被当成命令先执行,然后将结果作为参数传递给外部命令;而前者则是将后面的三个单词(echoShellStart)作为参数传递给 echo 命令。2.第一个命令调用外层的 echo 命令,其参数为字符串 "echo" 和变量 $c 的值,同时整个命令的标准输出被重定向到文件 file1。文件 file1 中会写入 echo 与变量 $c 的值使用空格拼接的字符串。第二个命令先执行被 ` ` 包围的 echo $c>file1,即将变量 $c 的值写入文file1,然后将结果作为参数传递给外部的 echo 命令。由于 ` ` 内的命令反回值为空,所以最终的结果是 file1 中只有变量 $c 的值,而终端上没有输出。难点分析1.Makefile 调用子目录下的 Makefile:$(MAKE) -C subdir2.sed 替换文本时可使用不同的分隔符,如 sed 's|/|\\|g'3.bash 里从完整路径提取不含扩展名的文件名:1filename=${file##*/}Shell2${filename%.*}实验体会虽然平时对 Git 略有涉猎,但本次实验让我对 Git 的基本操作有了更深入的理解,学会了以前没遇到过的情况。同时,通过文件的操作部分,我也复习Shell 脚本中重定向、调用命令等操作。这对于后续实验的进行想必会有很大的帮助。

lab0-exam

GCC & Makefile Quiz

完成初始化後,倉庫根目錄下已經生成了 Makefile、check.c、src 資料夾和 out 資料夾。

在倉庫根目錄(如 ~/23xxxxx )下編寫 Makefile。要求實現的功能如下:

執行命令實現功能
make check利用 gcc 將同目錄下的 check.c 編譯成名為 check.o 的未連結的目標檔案,並放在同目錄下。
make完成 make check 要求的功能。然後利用 gcc 將 src 下的 main.c、output.c 編譯成名為 main 的可執行檔案,並放在 out 目錄下。
make run直接執行可執行檔案 out/main。
make clean刪除目標檔案 check.o、可執行檔案 out/main。

GCC & Bash Quiz

完成初始化後,倉庫根目錄下已經生成了 exam_1.sh 至 exam_9.sh(從1開始的連續整命令名的.sh檔案,共9個)、run_exam.sh、stderr.txt 和 origin 資料夾。

在倉庫根目錄(如 ~/23xxxxx )下編寫 exam_1.sh 至 exam_9.sh。要求實現且僅實現以下第x點功能。

這些指令碼將被 run_exam.sh 呼叫執行。使用 run_exam.sh 的命令格式為 bash run_exam.sh [n] [s] [t],其中 n 為小於等於9 的整數,表示將按順序執行 exam_1.shexam_n.sh。若 n 未給出,將預設是 9。可選的 s 和 t 用於傳遞給 exam_9.sh,具體要求見第 9 點功能。(注意:根據命令格式,若要指定 s 和 t,必須先指定 n)

這個部分討厭的是評測點是累進的,由於後面的操作依賴於前面的操作,所以如果前面的操作沒有正確實現,寫完提交一看才十幾分比較虛。不過檔案操作的話,後面的操作可以作為前面的提示。

  1. 建立一個新的目錄,名為 result。再在 result 目錄下建立兩個新的目錄,名為 code 和 backup。

    exam_1.sh
    mkdir result
    mkdir result/code
    mkdir result/backup
  2. 將 origin 目錄下的 basic.c 的檔案中包含 hello(區分大小寫)的行輸出。

    exam_2.sh
    grep "hello" origin/basic.c
  3. 將 origin 目錄下的 basic.c 檔案移動到 result 目錄下。

    exam_3.sh
    mv origin/basic.c result/basic.c
  4. 將 origin 目錄下的 code 目錄及其內容複製到 result/backup 目錄下。

    exam_4.sh
    cp -r origin/code result/backup/code
    cp origin/code/* result/backup/

    不知道具體要求的是哪一種,似乎第一次嘗試時沒過評測。

  5. 將 origin/code 目錄下的 0.c 1.c 2.c …… 20.c(從0開始的連續整數命名的 .c 檔案,共21個)檔案中的所有 REPLACE(區分大小寫)替換為檔名(不含副檔名),替換的結果儲存到 result/code 目錄下的同名檔案中。

    如對於這樣的 origin/code/1.c:

    int main() {
        return REPLACE;
    }

    替換的結果如下,並且這個結果儲存在 result/code/1.c 中:

    int main() {
        return 1;
    }

    這裡麻煩的是如何從路徑提取不含字尾的檔名。之前打 Hackgergame 的時候研究過一番 shell 字串處理(欠了兩年題解沒寫:),但是都忘了。是次考前從圖書館借了兩本 Linux Shell 程式設計的書,從例子部分偷到了用法。

    Linux Shell命令列及指令碼程式設計例項詳解(第2版) book 2024 ISBN 9787302660194
    by 劉豔濤、
    出版社:清華大學出版社

    《Linux Shell命令列及指令碼程式設計例項詳解(第2版)》是獲得大量讀者好評的“Linux典藏大系”中的經典暢銷書《Linux Shell命令列及指令碼程式設計例項詳解》的第2版。本書第1版累計13次印刷,銷量超過2萬冊,被ChinaUnix技術社羣大力推薦。本書理論結合實踐,全面、系統地介紹Linux Shell(Bash)指令碼程式設計的語法、命令和技巧等內容。本書偏重於實踐,在講解理論知識時結合大量典型例項讓讀者瞭解理論知識在實際環境中的應用,並對易混淆和較難理解的知識點做了重點分析,以加深讀者對知識的理解。本書提供教學影片、例項源程式、思維導圖、教學PPT和習題參考答案等超值配套資源,以幫助讀者高效、直觀地學習。 《Linux Shell命令列及指令碼程式設計例項詳解(第2版)》共15章,分為2篇。第1篇“Linux Shell基礎知識與命令”,主要內容包括Linux和Linux Shell簡介、初識Linux Shell、常用的Shell(Bash)命令、Shell命令進階;第2篇“Shell指令碼程式設計”,主要內容包括Shell程式設計基礎、Shell的條件執行、Bash迴圈、Shell函式、正規表示式、指令碼輸入處理、Shell重定向、管道和過濾器、捕獲、sed和awk、其他Linux Shell概述。 《Linux Shell命令列及指令碼程式設計例項詳解(第2版)》非常適合初次接觸Linux Shell命令列和指令碼程式設計的入門讀者閱讀,也適合有一定基礎而想進一步提升的進階讀者閱讀,還適合作為高等院校和Linux培訓機構的教材。對於基於Linux平臺的開發人員而言,本書還是一本不可多得的案頭查詢手冊。 劉豔濤,就職於一家全球500強通訊公司,從事公司無線產品研發中心的Linux/Unix作業系統的管理和技術支援。有超過15年的Linux系統管理與運維經驗,擅長用Shell等指令碼語言實現自動化運維管理,以及配置Nagios與Ganglia整合的自動化監控和故障報警平臺,對Linux系統效能最佳化有深入的研究。

    第 104 頁
    exam_5.sh
    for file in `ls origin/code/*.c`
    do
        filename=${file##*/}
        # echo $filename
        # echo ${filename%.*}
        sed "s/REPLACE/${filename%.*}/g" $file > "result/code/${filename}"
        # sed 's/REPLACE//g' $file >
    done
    • 從開頭刪除最短匹配的模式:var#
    • 從開頭刪除最長匹配的模式:var##
    • 從結尾刪除最短匹配的模式:var%
    • 從結尾刪除最長匹配的模式:var%%

    basename 的話,$(basename "$file" .${file##*.})

  6. 將 result/code 目錄下的全部 .c 檔案一起編譯為可執行檔案 result/verify。

    exam_6.sh
    gcc result/code/*.c -o result/verify
  7. 執行可執行檔案 result/verify,將其標準錯誤輸出的內容追加到倉庫根目錄下的 stderr.txt 檔案。

    exam_7.sh
    ./result/verify 2>>stderr.txt
  8. 將 stderr.txt 檔案的許可權修改為 r--r-----

    exam_8.sh
    chmod 440 stderr.txt
  9. run_exam.shbash `exam_9.sh [s] [t]` 的格式向 exam_9.sh 傳入兩個引數 s, t(整數且 s < t)。

    • 兩個引數預設時,輸出 stderr.txt 的所有內容。
    • 僅預設 t 時,輸出 stderr.txt 自行開始(行號從 1 開始編譯,輸出自第 s 行)至結尾的內容。
    • 兩個引數指定時,輸出 stderr.txt 自第 s 行至第 t 行的內容(輸出包含第 s 行,不含第 t 行)。
    exam_9.sh
    if [ -n "$1" ]; then
      if [ -n "$2" ]; then
        # echo "a"
        # echo "$(($2 - 1))"
        sed -n "$1,$(($2 - 1))p" stderr.txt
      else
        # echo "b"
        sed -n "$1,\$p" stderr.txt
      fi
    else
      cat stderr.txt
    fi

    這塊需要需要注意的是,sedp 命令列印的行數從 1 開始,且包含結束行。headtail 組合也可以,但是仍然需要

提示

  • 下發檔案中包含一個初始化指令碼 init.sh,如果你想將你的工作目錄下除了 Makefile 和 exam_1.sh 至 exam_9.sh 之外的所有檔案恢復到題目下發時的狀態,可以使用命令 bash init.sh 執行該指令碼。
  • 將多個檔案一起編譯,可以藉助萬用字元 *。如強制刪除當前目錄下的所有副檔名為 .txt 的檔案可以使用 rm -f *.txt

參考輸出

使用下發的 init.sh 初始化後,執行 make 後再執行 make run 的參考結果為:

See also

  1. BUAA-OS Lab0 實驗總結 - 北航作業系統 | Test Blog
  2. BUAA OS Lab0 - 鹿雜物閣
  3. BUAA OS——Lab0實驗報告 - Fight揚塵 - 部落格園
  4. 北航作業系統課程lab0實驗報告 - 南風北辰 - 部落格園
  5. BUAA-OS-2023-Lab0-Report | sin (cookedbear.top)
  6. 【BUAA-OS】lab0_linux基礎

評論

評論將在稽覈後顯示,閣下可以在本部落格的 Github 倉庫的 拉取請求列表 中檢視。提交成功後會自動跳轉。

本站不支持 Dark Reader 的暗色模式,请对本站关闭后再访问,亮色模式的对比度、亮度等选项不受影响。部分页面右上角提供暗色模式切换按钮,如果你没看到,说明你的浏览器尚不支持此特性。本提示不依赖于 JavaScript,你可自行查找其他用户在本站发表的关于如何关闭此提示的评论。