實驗思考題
思考0.1
通過你的使用經驗,簡單分析 CLI Shell,GUI Shell 在你使用過程中的各自優劣(100 字以內)
GUI界面清晰且易於理解,不需要太多專業知識的人也可以輕松使用,但是操作時無法得知背后的具體實現原理是什么。
CLI通過命令行控制程序,控制更為細致和具體,但是不經過相應學習和訓練無法掌握如何使用。
思考題 0.2
使用你知道的方法(包括重定向)創建下圖內容的文件(文件命名為test),將創建該文件的命令序列保存在command文件中,並將test文件作為批處理文件運行,將運行結果輸出至result文件中。給出command文件和result文件的內容,並對最后的結果進行解釋說明(可以從test文件的內容入手) 具體實現的過程中思考下列問題:echo echo Shell Start與 echo 'echo Shell Start'效果是否有區別 echo echo $c>file1 與 echo '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
直接執行echo echo Shell Start與 echo 'echo Shell Start'
效果沒有區別
把這兩條語句的結果寫入test.txt也沒有區別
但是把兩條語句的結果寫入test結果不同,
一個寫入echo Shell Start
一個寫入'echo Shell Start'
echo echo \$c>file1
是把echo $c的內容寫入file1
echo 'echo \$c>file1'
是把echo $c>file1輸出到屏幕
思考題 0.3
仔細看看這張圖,思考一下箭頭中的 add the file 、stage the file 和commit 分別對應的是 Git 里的哪些命令呢?
add the file
對應 git init
stage the file
對應git add
commit
對應git commit
思考題0.4
深夜,小明在做操作系統實驗。困意一陣陣襲來,小明睡倒在了鍵盤上。等到小明早上醒來的時候,他驚恐地發現,他把一個重要的代碼文件printf.c刪除掉了。苦惱的小明向你求助,你該怎樣幫他把代碼文件恢復呢?
git checkout --<file>
正在小明苦惱的時候,小紅主動請纓幫小明解決問題。小紅很爽快地在鍵盤上敲下了git rm printf.c,這下事情更復雜了,現在你又該如何處理才能彌補小紅的過錯呢?
git reset HEAD <file>
git checkout --<file>
·處理完代碼文件,你正打算去找小明說他的文件已經恢復了,但突然發現小明的倉庫里有一個叫Tucao.txt,你好奇地打開一看,發現是吐槽操作系統實驗的,且該文件已經被添加到暫存區了,面對這樣的情況,你該如何設置才能使Tucao.txt在不從工作區刪除的情況下不會被git commit指令提交到版本庫?
git checkout --<file>
vim .gitignore
中添加Tucao.txt
思考題0.5
# git clone 用於從遠程倉庫克隆一份到本地版本庫
$ git clone git@os-git.cscore.net.cn:學號-lab
思考下面四個描述,你覺得哪些正確,哪些錯誤,請給出你參考的資料或實驗證據。
- 克隆時所有分支均被克隆,但只有HEAD指向的分支被檢出。
節選自官網
Git 克隆的是該 Git 倉庫服務器上的幾乎所有數據,而不是僅僅復制完成你的工作所需要文件。 當你執行 git clone
命令的時候,默認配置下遠程 Git 倉庫中的每一個文件的每一個版本都將被拉取下來。 `
- 克隆出的工作區中執行 git log、git status、*git checkout、git commit等操作不會去訪問遠程版本庫。
正確 因為已經全都拉取下來了
- 克隆時只有遠程版本庫HEAD指向的分支被克隆。
錯誤
- 克隆后工作區的默認分支處於master分支。
正確
實驗難點圖示
本次實驗主要在第八個任務卡了很久,實驗總時長接近7個小時,里面可能有三四個小時以上都是耗費在這個上面,現在仍然存在一些困惑。
最早的版本沒有讀懂題目的意思,以為是在code里make兩個.o文件再在csc里make出fibo,所以雖然本地運行正確但是評測一直不對(提示找不到fibo.c)這里我現在還是沒理解,感覺如果沒有在code里make,運行make fibo應該提示我找不到main.o和fibo.o才對(如下)
經過助教的提醒我嘗試通過csc里的make調用子目錄下的make,我按照助教所說的使用了
cd code && make fibo.o
和 cd code && $(MAKE) fibo.o
均以失敗告終
下圖是根據網上查到的用法做出的嘗試,仍然失敗了
最后問了大佬才算做對一次,是把fibo生成的任務完全交給code里的make實現,外層的make只調用內層make(如下)
但是折騰了一晚上加一上午,最后發現居然外層的make就沒啥意義,感覺心里很不服氣,而且懷疑肯定有從外層調用子文件的內容make的方法,所以又嘗試出了第二個版本
如圖所示非常麻煩,不過起碼讓我把折磨我這么長時間的諸多問題想明白了
- 依賴關系部分寫的文件A,要和命令中出現的A名稱保持一致,和下文A依賴的其他文件的描述也要保持一致
- 需要使用的.h文件通過 -I 和相對路徑引入即可 在依賴關系中可以省略
- 需要哪里的文件make就最好在那個目錄下完成make,不然加路徑太過繁瑣
前面的任務中對於sed和awk的使用也遇到了一些問題。最不能理解的就是為什么在博客園或者CSDN上搜到別人的解決方案,明明問題描述是類似的,我運行類似的代碼卻得不到相同的結果。
體會與感想
本次實驗學習時間加實戰時間超過10個小時,被很多無法理解的錯誤折磨得身心俱疲,似乎其他同學完成的要更輕松一些,按理說lab0不應該如此痛苦。
一方面確實要反省假期預習的工作不夠到位,另一方面也是因為着急oo沒有第一時間開始lab0,錯過了和同學們在群里討論的機會。前者已經沒法彌補,不過后者可以以后注意。
完成之后回過頭來看,其實lab0的難度並不高,主要還是自己相關只是太過缺乏,加之學習缺少章法造成的。大部分時間都在 缺乏宏觀思路的情況下瞎嘗試,也因此浪費了很多時間,(但我確實在很多情況下不知道為什么自己會錯)
指導書反饋
對於grep awk sed
等命令和shell運行的的機制還不是特別理解
對於文件來說shell是對於每一行執行一次嗎?上述指令的返回結果是一行還是多行?
(可能現在也不是特別確定...)
還有對於makefile所需的文件如果不在一個文件該如何處理,似乎在指導書上也沒有提及
雖然說很多知識指導書沒有寫到也可以自己百度,但是感覺搜到的結果質量參差不齊,還是有一點浪費時間