---
# System prepended metadata

title: Linux 組成、層次概念
tags: [Linux Shell]

---

---
title: 'Linux 組成、層次概念'
disqus: kyleAlien
---

Linux 組成、層次概念
===

## Overview of Content

Linux 其實是 Unix 的變種，它的本質還是 Unix 

> 從 Unix 發展的作業系統除了 Linux 之外，還有 Solaris & BSD

:::success
* 如果喜歡讀更好看一點的網頁版本，可以到我新做的網站 [**DevTech Ascendancy Hub**](https://devtechascendancy.com/)
    
    本篇文章對應的是 [**了解 Linux 組成：內核責任、GNU 工具、桌面環境 | 基礎版到發行版**](https://devtechascendancy.com/linux-composition-and-distros/)
:::
[TOC]

## Linux 基礎組成

不管是哪個版本的 Linux(CenterOS, RedHat, Unbuntu... 等等發行版本)，他們都是透過 4 個部份組成整個系統

1. **Linux 內核**：以下為內核中的幾個重要組件

    | 重點組件 | 概述 |
    | - | - |
    | 系統內存管理 | 有關於內存回收、虛擬內存、內存交換 (Swap)...等等 |
    | 進程管理 | 決定進程的優先順序，啟動順序 ...等等 |
    | 硬體設備管理 | 管理硬體的驅動，這個驅動會被當作特殊文件被管理（Node 唯一值） |
    | 系統呼叫、支援 | 像是 文件管理：Linux 支持讀取多種不同類型文件，像是 ext2~4, hpfs... 等等 |

2. **GNU 工具**

3. **圖形化桌面環境**

4. **應用軟體**

    > ![](https://i.imgur.com/fmrjRPb.png)

    
### Linux 抽象級別、層次

現在以令一個更加抽象的概念來看，Linux 主要有分為 3 個抽象層次

```mermaid
graph TB

subgraph Linux 組成
硬體
Linux核心
使用者程序
end
```

* **硬體（Hardware）**： CPU、硬碟、記憶體... 等等硬體裝置

    :::warning
    * **映像（`Image`）是硬體嘛**？
        
        這是一種抽象描述記憶體的方式，用來表示位元在記憶體中的 **特定實體排列**
    :::

* **Linux 核心（Kernel）**：核心是執行在記憶體中的軟體，它可以直接控制、操作硬體，由此可知它的 **重點在 ++管理硬體系統++，並提供硬體對外的溝通界面（抽象界面）**

    :::info
    * **核心模式**：
        
        核心是運行在 **核心模式**，其特點是可以不受限制的取運用處理器、記憶體資源
        
        > 所以核心沒控制好很容易造成系統崩潰
    :::

* **使用者程序（User process）**：所有應用都由核心通一管理，藉由一個一個應用組成了最頂層，也就是 **使用者空間（也可稱為 User speace）**
    
    > 有些應用不會直接與使用者互動，但它仍是使用者程序（像是背景服務應用）
    
    另一個定義：核心分配給使用者程序的記憶體空間，我們稱之為 **使用者空間（User space）**
    
    :::info
    * **使用者模式**：
        
        相對於核心模式，使用者模式可以取用的資源就受到了限制（無法無限制取用），並且使用者模式不能訪問核心模式的記憶體空間
        
        > 應用在核心的管理之下，所以如果應用崩潰也可由核心回收資源，不會導致系統崩潰
    :::
    


## 內核空間：內核責任

第一版 Linux 內核是由 Linus Torvalds 發行（那時是為了模仿 Unix 操作系統）；以下會簡介 Linux 內核 中幾個重要的組件、特色


### 應用管理：上下文切換

* 程式在記憶體上的劃分單元就是 **進程**（`Process`）；程式可以運行在前台（可見）、也可以運行在後台（不可見）… 那系統中一定會運行不只一個應用，這些應用們由誰管理呢？
    
    **核心會管理所有程序**（`Process Management`），它涉及程序的啟動、暫停、恢復、中止... 等等行為

    ```mermaid
    graph TB;

    subgraph 核心管理鏈表
    n1(node 1)
    n2(node 2)
    n3(node 3)
    end

    a1(應用 a)
    a2(應用 b)
    a3(應用 c)

    n1 -.-> a1
    n2 -.-> a2
    n3 -.-> a3
    ```
    
    :::warning
    * **上下文切換 `Context Switch`** ？
    
        在多應用執行時，核心會分配 CPU 資源，不會讓單個應用執行完才運行令一個，而是 **讓 CPU 快速切換資源，讓多個程序看起來是一起執行的**；
        

        
        :::success
        * 核心管理程序的概念順序如下：
            
            > 核心執行的時間點就是 **上下文切換的時間間隙**

            1. CPU 為每個應用計時，計時到就切換為核心模式，由核心接管 CPU 資源

            2. 核心紀錄下每個 CPU 的記憶體狀態資訊

                > 等到下次要恢復某個應用時可以用到這些記憶體資訊

            3. 核心執行上一個時間段內的任務

                > 處理核心自身的任務（eg. 像是讀取輸入、輸出、硬碟操作）

            4. 核心執行下一個程序
                
                > 下一個要運行的使用者空間的程序

            5. 核心為新程序準備 CPU、記憶體

            6. 核心江心程序執行的時間通知 CPU（計時 CPU 的使用時間） 

            7. 核心將 CPU 切換置使用者模式，將 CPU 控制權交給新應用

        :::
    :::


    
* **進程的啟動順序**：這取決於你使用哪一版的 Linux，啟動順序往往會放在一個文件中做管理；Ubuntu 就會放置在 `/etc/init.d` 目錄下
    :::info
    Linux 中運行的第一個程式稱為 init 進程
    :::

    > 其他 Linux 程式啟動順序則可能放置在 `/etc/inittab` 中

    在Linux系統中，init進程在啟動時會按照以下順序執行不同位置的腳本，順序如下：


    1. init 進程會讀取並執行 `/etc/inittab` or `etc/init.d` 文件中的腳本

    2. 接著 init 進程會讀取當前運行級別（run level）對應的 `/etc/rc<X>.d` 目錄下的腳本 (X 代表了運行等級)

        :::info
        * 目錄中以字母 S 開頭的腳本（S代表Start，即啟動腳本），按照文件名的字母順序執行其中的腳本

        * 目錄中以字母 K 開頭的腳本（K代表Kill，即停止腳本），同樣按照文件名的字母順序執行其中的腳本。
        :::

* **運行等級**：Linux 系統的運行等級有分為 5 個級別；這些級別可以調整（3 -> 5 將系統改為優先圖形系統）

    | 運行等級 | 特色 | e.g |
    | -------- | -------- | -------- |
    | 1 | 單用戶模式（啟動基本的系統進程 ＆ 一個控制台終端） | 通常在系統有問題需要做緊急修復時 |
    | 3 | 標準的系統運行等級，大多數軟體都運行在這個等級之下 | 網路應用 |
    | 5 | 啟動圖形化系統 | 圖形化桌面窗口登入系統 |


### 記憶體管理 ＆ 虛擬記憶體

* **內存就是記憶體 Memory**，程式運行就是建立在內存之上，當你在操控程式時其實就是在操控這個程式專屬區域的內存

    * 核心會管理所有記憶體，並為每個應用分配記憶體
    
    * 核心也管理包括了共享記憶體、空閒記憶體

        :::warning
        * **上下文切換管理記憶體**：
            
            我們上面有說核心運行的時機點就是，上下文切換的間隙，而記憶體的管理也是核心的工作之ㄧ；其特色如下
            
            
            * 核心有自己的專有記憶體空間，其他使用者程序無法使用
            
            * 而每個使用者程序也有自己的專用空間
            
            * 使用者應用程序之間無法存取另一個程序的專有記憶體空間
            
                > 除了記憶體共享，使用者程序之間可以透過 **記憶體共享** 來共享記憶體
            
            * 使用者程序的某些記憶體空間是唯讀取的
            
            * 透過硬體來作為虛擬記憶體，在程序需要時作為記憶體使用

        :::

* **虛擬記憶體**（虛擬內存）：當然這邊需要考慮到記憶體不足的情況，當記憶體不足時，就會 **取用「硬體」當作假的記憶體**
    
    :::info
    我們也知道如果使用硬體作為記憶體速度一定會變慢；這個交換過程稱為 swapping in/out，而平凡交換則會導致系統的不穩定（顫抖）
    :::
    
    ```mermaid
    graph LR;

    硬體 -.-> 虛擬記憶體

    subgraph 記憶體
    真實記憶體
    虛擬記憶體
    end
    ```

    1. 記憶體可能只有 4G，但當前在系統上運行的程式有 5G
    
    2. 這時為了避免系統當機或 Crush，會使用硬體當作記憶體來使用
    
    3. 實際情況會把使用率較低的程式放入硬體中儲存，當有需要時再將它的資料從硬體中取出

        :::success
        虛擬記憶體劃分並不是以 1Byte, 1K... 等等單元，它是 **使用一個虛擬單位 `Page`** 來劃分記憶體
        :::
        
* **MMU 記憶體管理單元**：
        
    新型（近代） CPU 提供 MMU 機制，也就是 **程序不會直接存取記憶體，而是 ++透過核心存取記憶體++**，當程序需要記憶體時，透過 MMU **記憶體映射** 來取得實體記憶體位置
    
    :::info
    * **分頁表（page table）**
    
        核心要做的工作就是在上下文切換時，將記憶體映射表從被移出程序轉給被移入的程序使用（管理記憶體映射表）
    :::

### 硬體設備管理

* **核心負責管理、操控硬體設備，並對外提供一個訪問界面**
    
    :::warning
    硬體設備只能在核心模式下被存取
    :::

    軟體最終都要透過硬體輸入（或輸出）才能接收到 User 指令 (像是鍵盤滑鼠)，而 Linux 內核的工作也包括與這些硬體通訊，與其通訊的方式有以下兩種

    1. 將特定硬體訊息 **編譯進內核驅動模塊**

        > 早期的設計

        ```mermaid
        graph LR

        subgraph 內核
        特定硬體訊息_1
        特定硬體訊息_2
        end
        ```

    2. **可熱插拔的內核驅動模塊**（需要在編譯內核時就設定可動態安裝驅動）
        
        > 當然是這個方便多了，可隨時添加移除硬體驅動

        ```mermaid
        graph LR

        subgraph 內核
        特定硬體訊息_1
        特定硬體訊息_2
        end

        特定硬體訊息_3 -.-> |insmod| 內核
        ```


* **硬體在內核中存在的方式**：Linux 系統會將硬體當作 **特殊的文件**，這文件通常分為 3 種

    | 驅動文件（特殊文件） | 說明 |
    | -------- | -------- |
    | 字符型設備文件 | 每次只能處理一個字符，通常是終端在使用 |
    | 塊設備文件 | 一次處理大量數據 |
    | 網路設備文件 | 數據包的接收 ＆ 發送 |

    :::info
    Linux 會為每個設備提供一個文件，該文件稱為一個 **節點 Node**，這個節點在 Linux 中具有唯一性（對同個機台而言）
    :::

### 系統呼叫、文件管理

* 核心還對使用者程序提供其他功能：
    
    * **系統呼叫（`System call` or `syscall`）**：
        
        系統呼叫是使用者空間應用，用來訪問核心的方式，其中常見的有 `fork`、`exec` 兩個函數

        * **`fork` 函數**：核心會建立一個和該程序幾乎一模一樣的 **副本**

        * **`exec` 函數**：核心會替換某個應用到指定記憶體中

    * **虛擬設備（`pseudodevices`）**：
        
        虛擬設備對於使用者程序來說就是真實設備，但其實是透過軟體實現的

    * **文件管理**：Linux 內核支持讀取硬碟中的多種不同類型文件（其中也包括 Windows 文件），以下是 Linux 標準文件

        | 文件系統 | 說明 | 補充 |
        | -------- | -------- | - |
        | ext | Linux 擴展文件系統 | 最初文件系統 |
        | ext2 | 拓展 ext | 拓展多功能 |
        | ext3 | 拓展 ext2 | 支持日誌功能 |
        | ext4 | 拓展 ext3 | 支持高級日誌功能 |
        | hpfs | IBM 公司為 `OS/2` 操作系統開發的一種文件系 | 高性能、安全性文件 |
        | jfs | IBM 日誌文件系統 | - |
        | iso9660 | CD-ROM | - |
        | minix | MINIX 文件系統  | - |
        | ncp | Netware文件系统 | - |
        | nfs | 網路文件系統 | - |
        | ntfs | Microsoft NT文件系统 | - |
        | proc | 訪問系統訊息文件 | - |
        | ReiserFS | 高級 Linux 文件系統 | 更高性能，硬碟恢復功能 |
        | smb | Samba SMB文件系统 | - |
        | sysv | 早期 Unix 文件系統 | - |
        | ufs | BSD 文件系統 | - |
        | umsdos | 建立在 msdos 上的類 Unix 文件系統 | - |
        | vfat | Window 95 文件系統 | FAT32 |
        | XFS | 高性能 64 位元日誌文件系統 | - |


        :::success
        * **這麼多文件系統要怎麼統一**？

            Linux 內核中有一個標準接口（protocol），只要實作這個接口就可以讀取任意文件系統，這個接口稱為 **VFS (`Virtual File System`)**
        :::


## GUN 工具

除了內核控制硬體設備之外還需要一些標準功能（控制文件、GBD 調適、網路功能...），這些功能就由 GUN 完成

> Linux 中的 GNU 工具則是仿 Unix 計算機上的功能

GNU (GNU's Not Unix) 開發了一套完整的 Unix 工具，這整套程式都是開源軟體，這些工具不包括內核系統


### 核心工具

* GNU 的主旨在於為 Unix 系統管理員設計出一套類似 Unix 的環境（包括操作系統核心、命令列介面、標準程式庫、開發工具... 等等）

    為了這個目的有移植了很多常見的 Unix 命令工具 (Unix 環境移植到 GNU 環境中)，Linux 稱這些工具核心工具為 **coreutils** (組成如下)

    1. 處理文件工具
    
    2. 操作文本工具
    
    3. 管理進程工具

### Shell 互動工具

* GNU/Linux shell 是一種互動式工具，透過它可以執行命令與腳本
    
    > 多個命令組合起來就是一個腳本

    :::info
    Shell 並不直接與內核互動，而是它主要是與 GNU 工具和其他軟件進行互動（只能間接性的與內核互動），很適合拿來作為不同軟體的黏接面
    :::
    
* 而 Linux 系統上通常提供多種不同的 Shell 給使用者使用（每種 Shell 有不同特性），常見的 Shell 如下表

    | Shell 類型 | 特性 |
    | -------- | -------- |
    | Bourne shell | Unix 版本的 Shell |
    | bash shell | GNU 模仿 Bourne shell 的產品，這是最常見的 Shell (默認 Shell) |
    | ash | 運行在內存受限的輕量級 Shell (與 bash shell 相容) |
    | korn | 支持浮點數、高級編程特性 (與 Bourne shell 相容) |
    | tcsh | 擁有 Ｃ 語言特性的 Shell |
    | zsh | 結合多個 Shell 特性（bash shell, korn, tcsh...） |


## Linux 桌面環境


Linux 圖型化介面並不只一種方式，它類似於一種 Protocol，只要符合 Linux 開出的 Protocol 就可以使用不同方式做出介面

### 圖形工具：XWindow 系統

* XWindow 系統會與 PC 上的顯卡與顯示器（螢幕）打交道的底層程式，它會控制電腦上顯示出的 Window(視窗)、圖形

    :::success
    * XWindow 的實現有哪些？

        `X Window System` 是一種基於網絡的窗口系統；像是 `X.org` 就是一個開源的 X Window System（X11）的實現；
    :::

* XWindow 系統是主要顯示視窗、圖型… 如果要實現桌面化來操作文件或開啟應用，那還需要其他桌面系統來協助

    > 這樣說起來 XWindow 更像是一個產生圖形的 工具

### 桌面化：KDE 桌面

* KDE 桌面環境是在 1996 年作為開源項目發布，它的樣子類似 Window 桌面，它主要由 四個部分組成

    1. **KDE 菜單**：與 Window 的菜單功能類似
        
        KDE 桌面環境包含了一個功能豐富的菜單系統，類似於 Windows 桌面的菜單，用戶可以通過菜單來訪問安裝的應用程序、系統設置和其他功能
        
    2. **應用快捷**：桌面有應用的快捷連結
        
        KDE桌面環境允許用戶在桌面上放置應用程序的快捷方式，這使得用戶可以快速訪問和啟動常用的應用程序，提高了操作效率
    
    3. **任務欄**：可以查看當前運行的任務，並顯示運行中任務的圖標
        
        KDE 桌面環境包含一個名為「任務欄」的組件，用於顯示當前正在運行的任務和應用程序，並且可以顯示相應應用程序的圖標，使用戶可以輕鬆切換和管理正在運行的應用程序
    
    4. **小應用**：類似於桌面上的小工具

        KDE 桌面環境提供了一個名為「小應用」的功能，類似於桌面上的小工具（`Widget`），用戶可以通過添加不同類型的小應用來擴展桌面功能，例如天氣預報、系統監視器等
        

* **KDE 桌面使用場景**：
    
    KDE桌面環境適用於各種場景，包括個人電腦、工作站、服務器和嵌入式設備等。它具有高度的可定製性，用戶可以根據自己的需求和偏好來調整和配置桌面環境，並且提供了豐富的擴展和插件支持，使得用戶可以根據自己的需要來擴展桌面功能
    
### 桌面化：GNOME 

* **GNOME**(`the FNU Network Object Model Environment`, GNU 網路對象模型環境) 是一個流行的開源桌面環境，主要用於Linux發行版
    
    它是由GNU計劃開發的，旨在提供一個現代化、直觀且易於使用的桌面環境，為用戶提供了豐富的功能和高度的可定製性
    
    > 像是 Red Hat Linux 就是使用這個桌面
    
* **GNOME 主要特點**：

    * **圖標桌面**：
        
        **GNOME 提供了一個桌面空間**，用戶可以在上面放置和組織圖標，這些圖標可以是應用程序、文件或文件夾等，這使得用戶可以快速訪問和啟動常用的應用程序或打開文件

    * **多個桌面**：
        
        **GNOME 支持多個虛擬桌面**，用戶可以在不同的桌面之間切換，這使得用戶可以更好地組織和管理打開的應用程序和窗口，提高了工作效率

    * **拖放功能**：
        
        **GNOME 具有強大的拖放功能**，用戶可以通過拖曳應用程序、文件或文件夾等物件來進行操作，例如移動到其他桌面、放置在面板上或將其拖到應用程序窗口中進行打開等。

    * **樣式與用戶體驗**：

        GNOME 的設計風格與 Windows 相似，但同時也具有其獨特的風格和特色。它注重直觀性和易用性，提供了一個簡潔、現代化且易於操作的用戶界面
        
        GNOME 的界面通常包括面板、應用程序菜單、窗口管理器和文件管理器等組件，用戶可以通過這些組件來訪問系統功能、應用程序和文件，並進行操作和管理

* **GNOME 使用場景**：

    GNOME 桌面環境適用於各種場景，包括個人電腦、工作站、服務器和嵌入式設備等。它為用戶提供了一個穩定、靈活和功能豐富的桌面環境，可以滿足不同用戶的需求和偏好

    ```mermaid
    graph LR

    GNOME --> 個人電腦
    GNOME --> 工作站
    GNOME --> 服務器
    GNOME --> 嵌入式設備
    ```

### 桌面化：Unity

* Unity 桌面系統是由 `Canonical` 公司負責開發的桌面環境，最初作為 Ubuntu Linux 發行版的默認桌面環境；它的目標是提供一個現代化、直觀且功能豐富的使用者界面，適用於多種設備，包括工作站、平板電腦和移動設備

* **Unity 主要特點**

    * **現代化的用戶界面**：
        
        Unity 桌面系統采用了現代化的設計風格，包括全局菜單、啟動器和快速應用程序切換等功能，使得用戶可以方便地訪問和管理應用程序

    * **全局搜索功能**：
        Unity 提供了一個強大的全局搜索功能，使用戶可以快速找到應用程序、文件和設置等內容，並且能夠直接從搜索結果中啟動應用程序或打開文件

    * **整合的通知系統**：
        Unity 桌面系統具有一個整合的通知系統，可以顯示來自應用程序和系統的通知，並且可以通過指示燈、聲音和彈出窗口等方式提醒用戶

    * **支持多種設備**：
        Unity桌面系統設計用於適應不同類型的設備，包括桌面電腦、筆記本電腦、平板電腦和智能手機等，並且提供了相應的界面優化和觸摸支持

    * **可定製性**：
        Unity桌面系統具有豐富的可定製性，用戶可以通過更改主題、安裝擴展和調整設置等方式來自定義桌面環境，以滿足個人偏好和需求

* **Unity 使用場景**

    * **工作站**：
        
        Unity桌面系統提供了一個現代化且功能豐富的桌面環境，非常適合用於日常工作、開發和娛樂等用途

    * **平板電腦**：
        
        Unity桌面系統具有觸摸支持和平板電腦友好的用戶界面，可以在平板電腦上提供優秀的用戶體驗

    * **移動設備**：（Android, iOS 系統都有支持）
        
        由於Unity桌面系統的輕量級和現代化設計，它也可以在一些較為資源有限的移動設備上運行，提供快速、流暢的使用體驗


        ```mermaid
        graph LR

        Unity --> 工作站
        Unity --> 平板電腦
        Unity --> 移動設備

        移動設備 --> Android
        移動設備 --> iOS
        ```


### 其他桌面化

* 桌面化其實是相當耗費內存的，如果電腦對於內存的使用較為苛刻就可以改用其他的桌面化系統（如下）

    | 桌面系統 | 特色 |
    | - | - |
    | Fluxbox | 沒有 Window 的桌面，僅有一個用來啟動應用的菜單 |
    | Xfce | 與 KDE 類似，但它少了很多圖像（適合低內存） |
    | JWM | 適合低內存 ＆ 低硬碟空間的輕量桌面 |
    | Fvwm | 支持虛擬桌面 ＆ Window（適合低內存） |
    | Fvwm95 | 類似 Fvwm，看起來像是 Window95 桌面 |


## Linux 發行版

我們知道 Linux 系統的四大部件（應用、桌面圖形化、GUN 工具、內核）後，就可以組合出一個 Linux 系統

> **組合部件後的 Linux 系統就是 ++Linux 發行版++** （發行版通常也分為幾種）

### 核心 Linux 發行版

* 核心 Linux 發行版 會包含上述的四大組件，不過它的選項、設定相當的多（對於新手較不健康）

    > 可能問你需要載入哪些默認應用、以及硬體配置... 等等

    以下是幾個較常見的發行版
    
    | 發行版 | 特點 |
    | - | - |
    | Slackware | 最早期的 Linux 發行版 |
    | Red Hat | 主要用於 Internet 服務的商業發行版 |
    | Fedora | Red Hat 的家用版分支 |
    | Gentoo | 高級 Linux 用戶版本，包含 Linux source code |
    | openSUSE | 用於商用、家用的版本 |
    | Debain | 用於商用、家用的版本 |

### 特定用途 發行版

* 常基於某個主流發行版，但僅包含主流發行版中一小部分用於某種特定用途的應用程式；對於新手來說會幫忙自動檢測、配置硬體

    | 發行版 | 特點 |
    | - | - |
    | CenterOS | 包含 Linux source code 的免費企業版 |
    | Ubuntu | 學校、家用 |
    | PCLinuxOS | 家庭、辦公用（免費版） |
    | Mint | 家庭、娛樂用（免費版） |
    | dyne:bolic | 音頻、MIDI 應用的（免費版） |
    | Puppy Linux | 老舊電腦用（免費版） |
    
    :::success
    大多數 Linux 特定用途發行版都是基於 **Debian Linux** （可以和 Debian 一樣安裝文件，但僅打包了完正的 Debian 系統之的一部分）
    :::

### LiveCD 測試發行版

* LiveCD 測試發行版的特點在於：^1.^ 透過 CD 啟動、^2.^ 並非完整版的 Linux 系統、^3.^ 內部可以有各種不同的軟體

* 由於是攜帶型的版本，所以它也有一些缺點：^1.^ 速度較慢、^2.^ 無法對 CD 寫入數據

    :::info
    * **對接技術** (解決無法寫入數據問題的方案)：

        透過將 Linux 核心文件複製到內存（記憶體）中，就可以移除硬碟，並仍保持運行系統 
    :::
    
    其中有名的 LiveCD 發行版如下

    | 發行版 | 特點 |
    | - | - |
    | Knoppix | 最早期來自德國的一款 Linux LiveCD 發行版 |
    | PCLinuxOS | 成熟的 LiveCD 發行版 |
    | Ubuntu | 多語言世界級項目～ |
    | Slax | 基於 Slackware Linux 的一款 Linux LiveCD |
    | Puppy Linux | 為老舊 PC 設置 |


## Appendix & FAQ

:::info
:::

###### tags: `Linux Shell`
