CLI(Command Line Interface)
指的是使用指令進行電腦操作的系統界面
無論我們使用什麼系統 總歸和CLI有著不可分割的關係
可是當我們面對一行一行的指令以及很單調的黑底白字
還沒辦法像普通GUI一樣多畫面和使用滑鼠
那我們要怎麼讓自己的工作更方便呢
# 前言
CLI是一個很有趣的操作模式
可以藉由它用指令來做到很多圖形操作不好做的事情
加上之前有提過使用Python搭配Linux的環境進行開發
不過許多人一看到那一排排的文字和黑底畫面就被勸退了
今天就配合Linux來解說
由淺入深來熟悉CLI的操作方式吧
觀前提示
- 本篇文章是給新手小白看的 如果你是大佬你可以關掉去看別篇了
- 筆者的示意圖會以Mac的Iterm透過ssh連線到Linux進行操作
如果直接有Linux可以跟著玩的話當然是最好的
但是如果你是Windows的話
你可以透過WSL或是其他的虛擬機進行操作
這邊就不多做解釋了 - 由於距離前篇時隔多年
因此單獨看本篇可能會覺得有些凌亂
但我會盡量讓它單獨成一篇看也不沒問題
如果過於散亂還望見諒 - 兄弟轉個身(吉伊卡哇臉)
# 你知道終端機嗎
首先先來解釋一下「終端機」的意思
終端機在古早大型電腦的時代
是指連接到機房內那個超大沒有顯示器的主機的輸出輸入設備
現在由於個人電腦的普及
終端機就讓是使用者透過shell與電腦直接交流的介面
也就是我們平常看到的那個打指令的黑底白字畫面
我們先來簡介一下之後會用到的用詞
Terminal: 中文叫終端機,代表跟電腦交流的介面Shell: 負責將使用者由終端輸入的指令和腳本解釋給電腦操作的程式
# Windows
Windows系統有自己自帶的兩種終端機
分別是cmd與powershell
cmd是Windows的舊終端機
powershell是Windows的新終端機
前者由於年代過於久遠
許多指令都極度的特立獨行
現在除了寫特定功用的Batch腳本以外比較少人在使用了
後者是為了取代CMD而生的
目前依舊是有廣大的使用者
不過今天的主題主要會以Linux的CLI操作為主
這個並不是今天主要要談的主題
這邊就附上一篇有趣的簡報讓各位做延伸閱讀吧
另外近5年有一種新的終端
叫做windows subsystem for linux簡稱WSL
不過這個的使用上幾乎約等於比較簡單的Linux虛擬機
因此直接留到後面去解釋
如果要在windows流暢使用終端的話
推薦一個叫做Windows Terminal的應用程式
他可以嵌入包含cmd、powershell、WSL等等的終端
並且可以自訂主題和快捷鍵
個人覺得很方便 筆者目前在窗戶系統上是常駐使用這個進行操作
# 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 SHellbash: Bourne Again SHellzsh: 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
ls是list的縮寫
用來列出目前目錄下的檔案
由於我們的操作相當於在Windows底下瀏覽檔案總管
因此會需要這樣的指令來查看目前目錄下有什麼檔案
ls
ls -l # 以詳細模式列出
ls -a # 連隱藏檔案一起列出
ls <path> # 列出指定目錄下的檔案
你可能會注意到
有一個參數-a會印出隱藏檔案
什麼檔案這麼神秘呢
其實在Linux系統底下 也有像Windows一樣的隱藏檔案
在Linux底下的隱藏檔案是以.開頭的檔案

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

# cd
cd是change directory的縮寫
用以切換當前的目錄
cd <path> # 切換到指定目錄 <path>可以為相對路徑或是絕對路徑
其中有一些不一樣的用法
例如<path>可以使用一些特殊的參數
~代表的是家目錄..代表的是上一層目錄.代表的是當前目錄
# Linux底下的結構
Linux的目錄很有趣
相對於多數人使用Windows不太管檔案放哪裡的問題
(我相信有超過90%以上的人會把下載下來的東西無腦丟在桌面)
不過這點在Linux就不太一樣了
雖然在GUI版的Linux發行版中也有桌面的存在
但多數使用時都是純CLI進行操作
因此檔案的整理和歸納就顯得十分重要
# 檔案結構
Linux的檔案結構是以整個系統為基礎
進行樹狀結構的展開
可以想像為Windows底下的C:\槽
其中以/為根目錄進行拓展

當中有一些特別的目錄
例如
/bin: 放置系統的基本指令/etc: 放置系統的設定檔/home: 放置使用者的家目錄/usr: 放置系統的應用程式
等等
這些目錄都非常重要且敏感
如果你不知道你在做什麼
千萬不要嘗試去刪除或是修改這些目錄中的檔案
# 家目錄
如果你剛進系統的時候輸入pwd
應該預設會看到的是/home/<username>
這是由於Linux預設的起點目錄位於/下的home目錄
並基於使用者建立一個屬於個人資料夾
又稱家目錄
這個目錄底下主要用於放置使用者的個人檔案
例如文件、音樂、影片 以及一些個人設定等等
# 檔案權限
Linux的檔案有著非常嚴格的權限控管
每個檔案都有著自己的擁有者和群組
並能夠設置對應的使用權限
權限的劃分主要分為三個部分
r: 讀取w: 寫入x: 執行
這三個權限分別對應到檔案的擁有者、群組和其他使用者
也就是可以指定檔案的擁有者才能夠讀取、寫入或是執行
也可以設定給群組或是其他使用者做rwx操作
這些檔案的設定可以透過chmod指令進行修改
由於權限設定的部分水很深 這個之後再做解釋
如果多人共用同一系統的話
強烈建議將非共用的資料夾都設定成僅擁有者可寫入的狀態
筆者親身經歷過
因為權限沒設定清楚的緣故
導致有人電腦中勒索病毒結果透過smb影響到伺服器上
超多張正在遊玩的minecraft地圖直接死檔
人都裂開了
# 更多操作
# mv
mv是move的縮寫
用來移動檔案或是更改檔案名稱
要小心使用
如果搬移目錄會連同底下的內容一起搬走
mv <source> <destination> # 將<source>檔案移動到<destination>目錄下
mv <source> <destination> # 將<source>檔案更名為<destination>


# touch
touch是用來建立新檔案或是更改檔案的時間戳記的指令
基本上只要理解是建立新檔案就好
touch <filename> # 建立新檔案
# mkdir
mkdir是make 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了
要換掉預設的bash或sh的話
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了
不過僅此而已的話就只有套件管理器而沒有套件了
bash和zsh都是可以自定義設定檔的
只要更改~/.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()
這裡示範了兩個套件
分別是nerdtree和coc.nvim
nerdtree是一款file tree的套件
可以讓你在vim中像vscode的左排一樣有檔案總管
官方文檔有教學如何進行配置
coc則是一款很有名、功能也十分完全自動補全的套件
可以讓你在vim中像vscode一樣有自動補全和檢查錯誤的功能
並支援多種語言
包括但不限於常見的Python、Javascript、Go、C++等等等
不過相對的 越是方便的套件
基礎設定也就越複雜
不過好險官方有提供非常完善的教學文檔
歡迎去參考看看
接著執行
vim +PlugInstall +qall
就能夠下載並自動安裝這些套件了
如果各位有興趣
可以上網找找vim plug
應該可以找到各路大神推薦的套件清單
# 結語
Linux的使用其實並不複雜
如果你玩過Minecraft
更甚至是早期需要打指令作弊的遊戲
那上手Linux對你來說一定不會是件難事
雖然本篇感覺很像把人當笨蛋在教
但對於像筆者我這種沒什麼基礎反應也比較慢的人
很能夠理解看教學
卻因為作者假設你已經知道的部分而無法理解的感受
也許本篇文章就能夠幫助到一些些跟我一樣經歷的人們
另外 如果真的真的真的看到頭很暈
不知道怎麽設定的話
以下有筆者我自己的dotfile可以直接拿來參考看看
雖然寫得不算很好看
但拿來研究寫法應該已經夠了
那麼有機會再看看下一篇要科普什麼知識吧
我們下期再見
