# Shell contributed by < `Nickxingyu` > --- 使用者與 OS 的互動介面,分為兩種 1. GUI(Graphic User Interface) 3. CLI(Command Line Interface) ## CLI 可以將 Shell 視為運行在作業系統上的一個 Process,其主要目的為接收使用者的輸入(input 通常是從鍵盤),將輸入的指令直譯並執行,使用者可以選擇安裝使用不同的Shell,常見的有: 1. bash ( Linux & macOS ) 2. PowerShell ( Windows ) 3. zsh 不同的 Shell 提供的指令可能會不一樣,像是新增一個檔案在 bash 中使用 **touch**,而在 PowerShell 中則是使用 **New-Item** 1. **bash** ![](https://i.imgur.com/kSLoS3w.png) 1. **PowerShell** ![](https://i.imgur.com/Eq7VxK3.png) ## Shell Operation 以 bash 為例,在 bash 中若想要更了解一些指令的話可以輸入" man 指令名稱" 以下簡單介紹三種常見指令 ![](https://i.imgur.com/lT6fYDx.png) 1. **ls** :列出目前工作目錄底下的檔案 ![](https://i.imgur.com/HrkjCvZ.png) --- 2. **cd** : Change directory 改變工作目錄,其實就是換到其他的資料夾的概念,但是在 Linux 中並不把資料夾稱為 Folder 而是稱為 directory。 ![](https://i.imgur.com/2HMVgvc.png) 範例中紫色區域的部分就是目前工作目錄的路徑 path 使用 cd 指令時可以使用絕對路徑或是相對路徑 **絕對路徑** 其實就是**以根目錄當作參考點**的相對路徑 **相對路徑** 則是將當前目錄當作參考點 以下介紹一些路徑的表示法 ``` . 當前目錄 .. 當前目錄的 parent 目錄 / 根目錄 ``` 以下附上一些例子 首先 User 這個目錄中有 xingyu 及 shared 兩個子目錄 ![](https://i.imgur.com/QQAJodG.png) 首先我從根目錄出發( 注意紫色區域的開頭,一個屋子代表的是 xingyu 這個使用者,而一個資料夾為根目錄,但不同的shell可能表示方法不一樣 ) ![](https://i.imgur.com/pVFNAFD.png) --- 3. **echo** : 將輸入的內容輸出 ![](https://i.imgur.com/2cOc78H.png) ## 環境變數 Shell 被視為 Process ,那這個 Shell 可以 access的變數即為環境變數,那這些環境變數是有什麼用呢? 有時輸入指令時其實是執行某個程式來達到目的 而指令後輸入的內容則會被當作參數傳入該程式中 以 **echo** 為例 1. 我們先找到 echo 這個程式放在哪 ![](https://i.imgur.com/Gv8luME.png) 現在我們知道 echo 這個程式被放在 /bin這個目錄底下 但為什麼 Shell 會知道要到這個目錄底下找到 echo 執行呢? 2. 這時我們輸入 set 來看看環境變數 並找到其中的 PATH 變數,如果覺得變數太多,希望直接輸出 PATH變數 可以使用 echo 並將 PATH當作輸入,但要加$這個符號告訴 Sehll 參數是這個 PATH變數的值 ![](https://i.imgur.com/a71vQ9x.png) 這些變數以 " : " 分開,我們可以了解 PATH 這個變數中有以下這些 path ``` /Users/xuxingyu/.nvm/versions/node/v12.8.1/bin /usr/local/bin /usr/bin /bin <--------------------- !!!!!!注意!!!!! /usr/sbin /sbin ``` 為什麼要看這些變數呢? 因為 Shell 會依續在這些目錄中尋找到第一個名為 echo 的可執行檔並執行