# shell指令筆記 [Lecture 1: Course Overview + The Shell (2020)](https://www.youtube.com/watch?time_continue=695&v=Z56Jmr9Z34Q&feature=emb_title),也很感謝他們貼心附上[重點逐字稿](https://missing.csail.mit.edu/2020/course-shell/)能讓我更順利的了解這堂the shell的應用,觀看同時整理了這篇演講內容的筆記,也附上一些可能常會用到的指令,如果有錯誤的地方還請予以指正。・゚・(つдˋ)・゚・ ==shell prompt== 當開啟你的終端機就會看到包含 使用者名稱 + 所在資料夾 + 讓你知道這是打字地方的框框,這個就是prompt,而我們就會在框框的後面進行下指令的動作。 ![](https://i.imgur.com/H6xGBrY.png) :::info 有修改終端機設定,所以是可愛熊熊 ʕ·͡ᴥ·ʔ ::: ==date== 印出當下的時間及日期 ==echo== 印出我們輸入的參數 ==mkdir== 新增資料夾 ==空格及特殊字符== shell是透過空格來將指令拆分,並且執行第一個單字當作運行的參數,因此執行的參數如果包含空格或其他特殊字符,就需要使用`' '(單引號)`、`" "(雙引號)`或`\`來規避相關的字符。 ![](https://i.imgur.com/Ub1QNuq.png) :::info 舉上面例子,我想建立資料夾,如果使用上面的方式就會生成my、photo兩個資料夾,而我用`\`去規避空白,就能生成一個my photo的資料夾。 ::: ==PATH== `$PATH`這個環境變數會紀錄電腦所有執行檔放在哪裡,而Shell就會來搜尋這些目錄底下是否有適合的程式或檔案的名稱符合我嘗試想去執行的這段指令,且不同的路徑由`:`隔開。 ![](https://i.imgur.com/sn2GyP6.png) ==which== ==絕對路徑== 透過`which`就能知道我執行的指令是從哪來。 ![](https://i.imgur.com/MghfbIF.png) ==pwd== ==相對路徑== 輸入`pwd`就可以知道當下所在的路徑為何,當我`cd`進一個資料夾,我就改變的我目前的路徑。 ![](https://i.imgur.com/7Rq29kf.png) / / ==cd== 可以用在切換資料夾路徑,以下提供四種方式做搭配 ୧༼◕ ᴥ ◕༽୨ ==cd== + ==.== 代表現在的所在資料夾 ![](https://i.imgur.com/vpCVafH.png) ==cd== + ==`..`== 代表父層資料夾(上一層) ![](https://i.imgur.com/WsjRzaG.png) ==cd== + ==~== 回到自己(Users)目錄 ==cd== + ==-== 回到上一步,所以可以透過這方式在A、B兩地互換 ![](https://i.imgur.com/J6rbFBG.png) ==cd== + ==tab鍵== 這個方式會顯示出我當下資料夾可以`cd`進入哪些子層資料夾。 :::info 我們在`cd`時如果知道要進入的下一個資料夾是哪個,可以先打出那個資料夾的字首+`tab鍵`他就會自己幫你輸入完整的資料夾名稱了。 ::: / / ==ls== 查看現在這層dir有什麼資料 ==ls== + ==`..`== 查看父層dir有什麼資料 ==ls== + ==-l== 這個指令除了顯示dir內**可見**的資料外,還會顯示這些文件的rwx權限。 ![](https://i.imgur.com/HvuE9Xj.png) ==ls== + ==-al== 這個指令除了顯示dir內**不可見**的資料外,還會顯示這些文件的rwx權限。 ![](https://i.imgur.com/dZyPeCx.png) #### 什麼是rwx權限? 權限對於使用者分為三種: 1. User 2. Group 3. Other 而看到的rwx分別代表了: :::info ==read讀取== 是否允許觀看資料夾內的檔案及列出其內容 ==write寫入== 是否允許更改、新增或移除資料夾內的檔案 ==execute執行== 是否允許進入這個資料夾、檔案 ::: 首字`d`表示為該資料夾, 之後以rwx為一單位,和User - Group - Other各為一組 由下圖我們可以看到在Group跟Other的部分是沒有行使`w`的權限 ![](https://i.imgur.com/tyuN8mG.png) / / #### stream 資料流 在shell的程式中,把檔案讀入資料,經過處理之後,再將資料輸出到螢幕上,而其中讀入跟輸出就是兩個主要的資料流「輸入流(input stream)」跟「輸出流(output stream)」。 `>` input stream ,將檔案資料寫入 `<` output stream ,將檔案資料印出於螢幕 :::info ==echo 應用== 執行第一次 `$ echo hello > hello.txt` 建立一個hello.txt並將文字hello加到檔案裡面 ![](https://i.imgur.com/Ij93bKZ.png) 執行第二次 `$ echo meow > hello.txt` 將文字meow加到檔案裡面,並覆蓋掉檔案之前的內容 ![](https://i.imgur.com/YcCfxL6.png) . :::warning `>` stin會將之前的檔案清空,再放入增加的內容,如果想要保留之前的hello並加入新的meow就需要使用`>>`的方式 `$ echo meow >> hello.txt` ![](https://i.imgur.com/mA83zRF.png) ::: :::info ==cat 應用== 貓不是貓,這指令是將每個檔案依照順序讀取並把內容送到標準輸出。 如果我不想使用`cp`指令,透過`cat` + `>`方式也能做到同樣效果。 先假設我hello.txt檔案內有一個hello文字,我想建立一個hello2.txt的檔案並把文字複製過去: `$ cat < hello.txt > hello2.txt` 印出 hello2.txt => hello 同理,如果電腦內本來就有hello2.txt這個檔案,我在將hello.txt輸入的話,一樣會先清空檔案才將資料覆蓋進去。 要使用`>>`才會將hello.txt內的資料複製到hello2.txt底下。 `$ cat < hello.txt >> hello2.txt` ::: ==sudo== 在Unix-like系統中,`root`代表了「超級使用者」,他能做任何他想做的(rwx全能),而透過`sudo`這個指令我們就能得到`root`權限來執行一些我們平常不能做的事的話。 雖然平常只能做為一般使用者,不過也因為這樣我們可以避免影響到一些電腦輸出的項目,導致我們的電腦被搞壞。 ==control(⌘)== + ==L== 讓Terminal輸入框跑到最頂端 --- 參考資料: 1. Lecture 1: Course Overview + The Shell (2020) https://www.youtube.com/watch?v=Z56Jmr9Z34Q https://missing.csail.mit.edu/2020/course-shell/ 2. 鳥哥的 Linux 私房菜 http://linux.vbird.org/linux_basic/0320bash.php#redirect_redirect 3. Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單系列Day02-Shell 是什麼? https://ithelp.ithome.com.tw/articles/10216912