CLI(Command Line Interface)
指的是使用指令進行電腦操作的系統界面
無論我們使用什麼系統 總歸和 CLI 有著不可分割的關係
可是當我們面對一行一行的指令以及很單調的黑底白字
還沒辦法像普通 GUI 一樣多畫面和使用滑鼠
那我們要怎麼讓自己的工作更方便呢

# 前言

CLI 是一個很有趣的操作模式
可以藉由它用指令來做到很多圖形操作不好做的事情
加上之前有提過使用 Python 搭配 Linux 的環境進行開發
不過許多人一看到那一排排的文字和黑底畫面就被勸退了
今天就配合 Linux 來解說
由淺入深來熟悉 CLI 的操作方式吧

觀前提示

  • 本篇文章是給新手小白看的 如果你是大佬你可以關掉去看別篇了
  • 筆者的示意圖會以 Mac 的 Iterm 透過 ssh 連線到 Linux 進行操作
    如果直接有 Linux 可以跟著玩的話當然是最好的
    但是如果你是 Windows 的話
    你可以透過 WSL 或是其他的虛擬機進行操作
    這邊就不多做解釋了
  • 由於距離前篇時隔多年
    因此單獨看本篇可能會覺得有些凌亂
    但我會盡量讓它單獨成一篇看也不沒問題
    如果過於散亂還望見諒
  • 兄弟轉個身 (吉伊卡哇臉)

# 你知道終端機嗎

首先先來解釋一下「終端機」的意思
終端機在古早大型電腦的時代
是指連接到機房內那個超大沒有顯示器的主機的輸出輸入設備
現在由於個人電腦的普及
終端機就讓是使用者透過 shell 與電腦直接交流的介面
也就是我們平常看到的那個打指令的黑底白字畫面

我們先來簡介一下之後會用到的用詞

  • Terminal : 中文叫終端機,代表跟電腦交流的介面
  • Shell : 負責將使用者由終端輸入的指令和腳本解釋給電腦操作的程式

# Windows

Windows 系統有自己自帶的兩種終端機
分別是 cmdpowershell
cmd 是 Windows 的舊終端機
powershell 是 Windows 的新終端機
前者由於年代過於久遠
許多指令都極度的特立獨行
現在除了寫特定功用的 Batch 腳本以外比較少人在使用了
後者是為了取代 CMD 而生的
目前依舊是有廣大的使用者
不過今天的主題主要會以 Linux 的 CLI 操作為主
這個並不是今天主要要談的主題
這邊就附上一篇有趣的簡報讓各位做延伸閱讀吧

初見 Powershell - Mikucat

另外近 5 年有一種新的終端
叫做 windows subsystem for linux 簡稱 WSL
不過這個的使用上幾乎約等於比較簡單的 Linux 虛擬機
因此直接留到後面去解釋

如果要在 windows 流暢使用終端的話
推薦一個叫做 Windows Terminal 的應用程式
他可以嵌入包含 cmdpowershellWSL 等等的終端
並且可以自訂主題和快捷鍵
個人覺得很方便 筆者目前在窗戶系統上是常駐使用這個進行操作

# MacOS

MacOS 也有自己獨立的終端機
預設就叫 Terminal
不過我想多數使用者應該會安裝的是另一款 iTerm
這牌的終端機有著更多的功能和設定
支援度也比原生的終端好非常多
不過由於本身就是 Unix Like 系統
至於剩下操作的部分就和 Linux 很接近了

# Linux

這就是我們今天的重頭戲了
雖然多數人習慣了 GUI 的操作
但實際上 Linux 最有趣的正式在於作為 Server
使用終端機去交互的部分

Linux 由於其開源及廣泛程度
並沒有一個統一的終端軟體
且多數 Linux 系統都作為 Server 進行服務部署使用
因此多數使用者都會透過其他系統
如 Windows 和 MacOS 另外透過連線的方式連線到伺服器上
再進行操作 如同早期的硬體終端一樣
無論如何 終究會回到與 Shell 的交互操作上

# 和 Shell 混熟

為了能夠更快速的上手使用終端機
我們需要瞭解一下 Shell 在幹什麼
當我們打開終端機時
系統會噴幾行文字 讓我們輸入指令進行操作
此時我們在操作的程式就是 Shell
與 Shell 交互
就像執行其他程式語言的環境一樣
就能夠與檔案系統、網路、系統資訊等等進行互動
甚至能夠透過編寫腳本將 Shell Script 彙整
進行自動化的作業

# 常見的 Shell

在研究怎麽用之前
我們可以先來認識一下常見的 shell

  • sh : Bourne SHell
  • bash : Bourne Again SHell
  • zsh : Z SHell

這三種是筆者我在使用 Linux 系統時較常碰到的三種 shell
聽到名字大概會一臉矇逼吧
不過先知道光是 Shell 就有許多不同的牌子就好

# 進入 Shell

現在我們可以來試著進入 Shell
可以接著這篇超久以前的文章所灌的系統進行練習
根據系統的不同
進入 Shell 的方式也會有所不同
不過系統在你透過終端機連入之後
默認就會自動幫你開啟預設的 Shell 了
大多數的 Linux 系統都是使用 bash 作為預設的 Shell
不過也有些系統會使用 zsh 或是其他的 Shell (例如 MacOS 我記得就是... 嗎?) 你不是自己就用 Mac 嗎

Shell 本身也是一個程式 (Powershell 除外 PS 是基於.net 的 C# 物件)
因此你可以透過

bash

來開啟一個新的 Bash Shell 來進行操作
而你可以透過

echo $SHELL

來查看你的系統使用的是哪一個 Shell

# 複習一下基本操作

由於沒有圖形介面
我們所有的操作都是用文字來進行的
因此我們會先帶一些基本的指令
接著解說 Linux 底下的檔案結構
這樣應該會比較容易理解我們在做什麼

# ls

lslist 的縮寫
用來列出目前目錄下的檔案
由於我們的操作相當於在 Windows 底下瀏覽檔案總管
因此會需要這樣的指令來查看目前目錄下有什麼檔案

ls
ls -l # 以詳細模式列出
ls -a # 連隱藏檔案一起列出
ls <path> # 列出指定目錄下的檔案

你可能會注意到
有一個參數 -a 會印出隱藏檔案
什麼檔案這麼神秘呢
其實在 Linux 系統底下 也有像 Windows 一樣的隱藏檔案
在 Linux 底下的隱藏檔案是以 . 開頭的檔案

alt text

# pwd

pwdprint working directory 的縮寫
用來顯示目前所在的目錄
也就是告訴我們現在在什麼資料夾裡面

pwd

alt text

# cd

cdchange directory 的縮寫
用以切換當前的目錄

cd <path> # 切換到指定目錄 <path > 可以為相對路徑或是絕對路徑

其中有一些不一樣的用法
例如 <path> 可以使用一些特殊的參數

  • ~ 代表的是家目錄
  • .. 代表的是上一層目錄
  • . 代表的是當前目錄

# Linux 底下的結構

Linux 的目錄很有趣
相對於多數人使用 Windows 不太管檔案放哪裡的問題
(我相信有超過 90% 以上的人會把下載下來的東西無腦丟在桌面)
不過這點在 Linux 就不太一樣了
雖然在 GUI 版的 Linux 發行版中也有桌面的存在
但多數使用時都是純 CLI 進行操作
因此檔案的整理和歸納就顯得十分重要

# 檔案結構

Linux 的檔案結構是以整個系統為基礎
進行樹狀結構的展開
可以想像為 Windows 底下的 C:\槽
其中以 / 為根目錄進行拓展
alt text

當中有一些特別的目錄
例如

  • /bin : 放置系統的基本指令
  • /etc : 放置系統的設定檔
  • /home : 放置使用者的家目錄
  • /usr : 放置系統的應用程式

等等
這些目錄都非常重要且敏感
如果你不知道你在做什麼
千萬不要嘗試去刪除或是修改這些目錄中的檔案

# 家目錄

如果你剛進系統的時候輸入 pwd
應該預設會看到的是 /home/<username>
這是由於 Linux 預設的起點目錄位於 / 下的 home 目錄
並基於使用者建立一個屬於個人資料夾
又稱家目錄
這個目錄底下主要用於放置使用者的個人檔案
例如文件、音樂、影片 以及一些個人設定等等

# 檔案權限

Linux 的檔案有著非常嚴格的權限控管
每個檔案都有著自己的擁有者和群組
並能夠設置對應的使用權限

權限的劃分主要分為三個部分

  • r : 讀取
  • w : 寫入
  • x : 執行

這三個權限分別對應到檔案的擁有者、群組和其他使用者
也就是可以指定檔案的擁有者才能夠讀取、寫入或是執行
也可以設定給群組或是其他使用者做 rwx 操作
這些檔案的設定可以透過 chmod 指令進行修改
由於權限設定的部分水很深 這個之後再做解釋

如果多人共用同一系統的話
強烈建議將非共用的資料夾都設定成僅擁有者可寫入的狀態
筆者親身經歷過
因為權限沒設定清楚的緣故
導致有人電腦中勒索病毒結果透過smb影響到伺服器上
超多張正在遊玩的minecraft地圖直接死檔
人都裂開了

# 更多操作

# mv

mvmove 的縮寫
用來移動檔案或是更改檔案名稱
要小心使用
如果搬移目錄會連同底下的內容一起搬走

mv <source> <destination> # 將 & lt;source > 檔案移動到 & lt;destination > 目錄下
mv <source> <destination> # 將 & lt;source > 檔案更名為 & lt;destination>

alt text
alt text

# touch

touch 是用來建立新檔案或是更改檔案的時間戳記的指令
基本上只要理解是建立新檔案就好

touch <filename> # 建立新檔案

# mkdir

mkdirmake directory 的縮寫
用途顧名思義正式建立新的目錄

mkdir <dirname> # 建立新目錄

# 安裝套件和軟體

多數的 Linux 發行版都配有方便的套件管理器
以 Ubuntu 為例

sudo apt install <package> # 安裝套件

使用 apt-get 這個指令就可以很方便的使用 apt 套件管理器來安裝套件
不過有的套件在 apt 的套件庫中並沒有收藏
此時就會需要視你需要安裝的軟體
看他們的官方文件有沒有描述如何安裝
反正大部分時間照抄就對了
這邊列一些我自己平時灌系統會優先安裝的軟體

  • git : 版本控制軟體
  • neovim : 基於 vim 去改的文字編輯器
  • docker : 容器化服務軟體
  • wget : 下載工具
  • curl : 網路工具

# 個人化你的設定

剩下的部分就是看個人需求去做配置了
我個人喜歡自己自定義自己的樣式和主題
包含自己的 zsh 和 nvim 都弄得很有自己個性
然而我也有朋友並不喜歡我那些花俏的設定
因此本篇將以筆者我自己安裝的內容進行解說
下面的部分就見仁見智去挑選自己喜歡的用法吧

# zsh

雖然功能上差異並不算太大
但由於 zsh 有著更為豐富的使用者社群
因此就會有花樣百出的第三方套件和主題
所以筆者我從大概 5 年前就開始使用 zsh 了
要換掉預設的 bashsh 的話

sudo apt install zsh # 安裝 zsh
chsh -s $(which zsh) # 更換預設 shell
zsh

理論上手動執行一次 zsh
接著重新登入就會更新成功了

# zplug

zplug 是一款基於 zsh 的套件管理器
可以用來管理 zsh 的套件

curl -sL --proto-redir -all,https https://raw.githubusercontent.com/zplug/installer/master/installer.zsh | zsh

這樣就可以安裝 zplug 了
不過僅此而已的話就只有套件管理器而沒有套件了
bashzsh 都是可以自定義設定檔的
只要更改 ~/.bashrc 或是 ~/.zshrc 就可以更改設定
那這裡我們要引用想要的 zplug 套件的話
可以修改 .zshrc 檔案

source ~/.zplug/init.zsh
# Zplug plugins
zplug "romkatv/powerlevel10k", as:theme, depth:1
zplug 'zplug/zplug', hook-build:'zplug --self-manage'

這樣就可以在 zsh 啟動的時候自動載入這些套件了
有點太複雜了嗎?我們來解釋一下
這邊我們引用了一個叫做 powerlevel10k (簡稱 p10k) 的主題包
這包主題還蠻有名的
提供很多了可選的設定
只要安裝了之後在指令框中輸入

p10k configure

就可以進行設定了
如此一來即便是沒辦法獨立寫一整坨 zsh 設定檔的人
也能夠弄出像上面圖片一樣好看的介面了

# vim

問題來了
我們要怎麼修改設定檔呢
前面似乎都沒有介紹過建立檔案之後該如何進行編輯吧
此時就需要文字編輯器的登場了

在 Linux 系統中
較為主流有兩款文字編輯器
分別是

  • Nano
  • Vim

兩個體系都各有人喜歡
這裡就不各自比較他們的優缺點
因為筆者我對 Nano 實在不熟
而以 vim 作為著重介紹

# 簡介

vim 是一款自定義程度非常非常高的文字編輯器
也是由於其自定義程度高
受到了廣大社群的歡迎
筆者我也不例外
與 zsh 有點像 vim 的設定檔存放在 ~/.vimrc
等等會再來介紹怎麽操作和編寫設定檔

# 安裝

雖然幾乎現代發行版除了 Arch 那種輕量包或給容器化和嵌入式系統使用的版本外
幾乎都自帶 vim 和 nano 了
不過如果真的不巧沒有的話就安裝一下吧

sudo apt install vim

# 基本操作

vim 在使用上
有著非常獨特反人類的操作方式
光是使用說明就能出好幾本書
因此這裡我們只簡介一些基本的操作

# 模式

vim 有著三種模式

  • Normal : 正常模式
  • Insert : 插入模式
  • Visual : 視覺模式

當我們使用

vim <filename>

進入編輯器之後
我們首先會停留在 Normal 模式中
接著有兩個選擇

  • i : 進入 Insert 模式
  • v : 進入 Visual 模式

# 編輯

首先我們先進入 Insert 模式
接著我們就能夠正常的進行輸入和編輯了
雖然沒辦法使用滑鼠
操作上也有點反直覺
不過勉強還能夠進行打字輸入

然而此時我們遇到了一個問題
我打完了 我們要怎麼退出呢

# 指令

首先我們可以按 ESC 退出編輯模式
此時會回到 Normal 模式
Normal 模式和外面的 Shell 一樣
可以透過輸入指令來獲取一些程式的回饋
例如我們可以輸入

  • :q 來退出
  • :w 來儲存
  • :q! 來強制退出
  • :wq 來儲存並退出

也能夠在輸入指令的途中
再次按 ESC 回到 Normal 模式

# 視覺模式

視覺模式在 CLI 的編輯器中有點抽象
有點類似用鼠標去反白內容
只是是使用方向鍵去操作
反白選取內容之後我們可以做一些操作

  • d : 刪除
  • y : 複製
  • p : 貼上
  • x : 剪下

等等操作
就如同我們在 GUI 的編輯器中一樣

# 設定檔

方才提到
vim 的設定檔存放在 ~/.vimrc
既然我們學會了基本的操作
我們就可以用 vim 去修改他自己的設定檔了

vim 的設定檔有點特別
與 Shell Script 有點像
由 vim 的指令集組成並編寫成一個預設的腳本
這樣就能夠在 vim 啟動的時候自動載入這些設定了

這邊我們列一些常見的設定

set number # 顯示行號
set relativenumber # 顯示相對行號
set autoindent # 自動縮排
set tabstop=4 # 設定 tab 為 4 個空格
set shiftwidth=4 # 設定縮排為 4 個空格
set expandtab # 將 tab 轉換為空格
set hlsearch # 高亮搜尋結果

等等等
之所以會說是常見
是因為遠遠不止這些能夠設定
就像 vscode 一樣
vim 甚至能夠安裝許多的套件和主題來設定
包含常用的自動補全、file tree 等等
記得那個 OpenAI 和 Github 推出的 Githeub Copilot
連這個也能夠裝喔
夠強大了吧

# VimPlug

vim 也有許多牌的套件管理器
而我使用的一款叫 Vim Plug 的管理器

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

記得留意一下自己的編輯器是 neovim 還是 vim 兩者的路徑好像有差

這樣就可以安裝 VimPlug 了
接著我們可以在 ~/.vimrc 中加入一些套件的設定

call plug#begin('~/.vim/plugged')
Plug 'preservim/nerdtree'
Plug 'neoclide/coc.nvim', {'branch': 'master'}
call plug#end()

這裡示範了兩個套件
分別是 nerdtreecoc.nvim

nerdtree 是一款 file tree 的套件
可以讓你在 vim 中像 vscode 的左排一樣有檔案總管
官方文檔有教學如何進行配置

coc 則是一款很有名、功能也十分完全自動補全的套件
可以讓你在 vim 中像 vscode 一樣有自動補全和檢查錯誤的功能
並支援多種語言
包括但不限於常見的 Python、Javascript、Go、C++ 等等等
不過相對的 越是方便的套件
基礎設定也就越複雜
不過好險官方有提供非常完善的教學文檔
歡迎去參考看看

接著執行

vim +PlugInstall +qall

就能夠下載並自動安裝這些套件了
如果各位有興趣
可以上網找找 vim plug
應該可以找到各路大神推薦的套件清單

# 結語

Linux 的使用其實並不複雜
如果你玩過 Minecraft
更甚至是早期需要打指令作弊的遊戲
那上手 Linux 對你來說一定不會是件難事

雖然本篇感覺很像把人當笨蛋在教
但對於像筆者我這種沒什麼基礎反應也比較慢的人
很能夠理解看教學
卻因為作者假設你已經知道的部分而無法理解的感受
也許本篇文章就能夠幫助到一些些跟我一樣經歷的人們

另外 如果真的真的真的看到頭很暈
不知道怎麽設定的話
以下有筆者我自己的 dotfile 可以直接拿來參考看看
雖然寫得不算很好看
但拿來研究寫法應該已經夠了

那麼有機會再看看下一篇要科普什麼知識吧
我們下期再見

# 參考資料

# 附錄