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> # 將 & lt;source > 檔案移動到 & lt;destination > 目錄下 | |
mv <source> <destination> # 將 & lt;source > 檔案更名為 & lt;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 可以直接拿來參考看看
雖然寫得不算很好看
但拿來研究寫法應該已經夠了
那麼有機會再看看下一篇要科普什麼知識吧
我們下期再見