---
# System prepended metadata

title: Shell

---

# 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 的可執行檔並執行 

