iT邦幫忙

2025 iThome 鐵人賽

DAY 25
1

嗨!歡迎回到上班族的命令列生存手冊。本篇是生活品質篇的第一篇文章,手刀來介紹一下「設定檔」。還記得 vim 篇時,調整讓 vim 預設使用系統剪貼簿的設定嗎?當時調整了 .vimrc 檔案(ideavim 則是 .ideavimrc),相信讀者已經在系統之中探索了一段時間,也許注意到,這類的 . 點開頭的檔案(在 POSIX 系統的世界裡面,我們稱之為 dot files),幾乎都在家目錄之下。

除了家目錄以外,還有一些設定檔會藏在家目錄下的 .config 之中。剛好本系列文章介紹的兩個 shell — zsh 和 fish,它們倆置放的目錄不一樣。同時,我們也介紹一些 Linux 發行版會預裝的 bash,因為它和 zsh 的設定方式不會差太多。

bash:~/.bashrc
zsh: ~/.zshrc
fish:~/.config/fish/config.fish

如果這些檔案找不到怎麼辦?其實可以自行建立一個新的。

.config 目錄之下還有其他的資料夾,通常都是其他程式的設定檔。那既然說到 Shell,就來針對 zsh 和 fish 來說明,有什麼可以設定的地方?

快速輸入複雜指令 Alias

還記得 ls 指令嗎?如果要印出 Long Format 並且由大到小排列,並用人類看的懂的檔案大小格式表示?因為讀者已經到第 25 篇已經過於強大,就是:

$ ls -lhS

不過每次要查詢的時候都要重新打真的是非常的不方便,可以設定 alias 簡化這個指令,比如說可以設定成 $ lh 就是輸入以上的指令,怎麼設定呢?

fish 和 zsh/bash 設定方式是一樣的,請用最 ㄅ一ㄤˋ 的文字編輯器開啟以上兩者其中任意的設定檔,為求方便,筆者就以 fish 為範例,讀者自行代換即可。

bash

$ vim ~/.bashrc

zsh

$ vim ~/.zshrc

fish

$ vim ~/.config/fish/config.fish

進入設定檔後(無論是哪一個)請讀者都先捲動到「最下面」,讓我們來設定 alias 吧。請加上這一行:

alias lh='ls -lhS'

存檔後離開,這個時候你可能需要重新進入 fish,通常開新分頁或是重新開啟 Terminal App 就行了。

突然之間補充一個名詞,就是 Session!就是當開啟某個 Terminal Emulator App 並進入 Shell 後一切的活動,通常這些活動會在離開之後,再進來後一切指令就會重頭開始印。(或是讀者又在其他地方開了終端機,比如說 VSCode、Warp,看到的總會是另外一個全新的重新開始吧?)這個 Shell 活著的過程,我們稱呼它為一個 Session。這次開和下次開,是兩個不同的 Session,在不同地方開也是不同的 Session。

工商時間結束,這時新 Session 起來後,讀者只需要鍵入 $ lh 就能輸入 $ ls -lhS 指令了!
筆者自己有設定的還有哪些呢?有這些 cd 可以快速回去前幾頁:

## Navigation 
alias ..='cd ..'
alias ...='cd ../..'
alias .3='cd ../../..'
alias .4='cd ../../../..'
alias .5='cd ../../../../..'

所以只需要 .. 就可以回上一頁啦!

取代指令

如果把 alias 設定成和其他的指令相撞,就會先執行設定的 alias。像是在基礎操作篇提到rm 指令,很黃、很暴力。要怎麼樣才能減低影響呢?

筆者習慣會用以下指令來使用 rm

$ rm -vI

https://ithelp.ithome.com.tw/upload/images/20251009/20141615PViKwNrocw.png

-v 會印出 verbose 資訊,無論移除什麼東西都會印結果出來。而 -I 則是在刪除多個檔案時,會好心跑出來提醒「下手真的要這麼重嗎?」的事前確認。如果把 alias 設定為 rm 則在進行 rm 指令時實際上都是跑 rm -vI,每次都會有善意的提醒,是不是很安心呢?

alias rm='rm -vI'

從結構來看,alias 就是

alias <你想設定的指令> ='<要精簡的指令>'

讀者也可以自行設定 alias 提昇在文字界面的效率。

建立 Function

設定檔裡面可以先寫好 Shell Script,並呼喚它的名子就能執行。不過這邊就會碰到先前說的 fish 的 Script 自成一格的問題,bash 和 zsh 等可以用的 Shell Script,未必能在 Fish 上執行,所以也不能直接複製貼上使用。

這邊以工程師的好朋友 git 指令作為範例,git 可以顯示出一個 git repository(儲存庫)被更動的紀錄,指令是:

$ git log

假設隔天會議要報告前一週在做什麼,一時半刻可能還真的還不太起來,這樣就可以這樣設定:

$ git log --pretty=format:'- %s' --since="<日期>" --author="<作者>"

就可以把某個日期之後的 commit 標題列出來,減少尷尬的時刻。
上面這個指令就很適合寫成 Shell Script,還記得我們曾經寫過可以接收一個參數,讓他說 Hi 的一個簡易的 Shell Script 嗎?

#!/bin/bash
echo "Hi there! $1"

存成 sayHi.sh 後,後面的 $1 會由第一個參數讀取進來。我們也能依法炮製,在設定檔裡頭加入 Shell Script,讓它變成可以執行的 Function。

zsh/bash

請開啟 zsh 的設定檔:(如果設定 bash,請讀者自行調整指令)

$ vim ~/.zshrc

也請捲動到最下面空白處,貼上以下設定:

function showLogs {
    git log --pretty=format:'- %s' --since="$1" --author="$2" 
}

fish

開啟 fish 的設定檔,一樣捲動到空白處:

$ vim ~/.config/fish/config.fish

貼上以下設定,讀者應該會注意到 fish 使用的語法,和大家都不同。

function showLogs
    git log --pretty=format:'- %s' --since="$argv[1]" --author="$argv[2]" 
end

除了語法,接收參數的寫法也不同。一般使用 $1 錢字號後面加上數字來接收,fish 則是用 $argv[1] 那個 1 依此類推。
這個 Shell Script 或 Function 是下 $ git log 指令,格式是只列出條列式的標題,並用開始時間(作為第一個參數傳入)和作者(作為第二個參數傳入)來過濾 commit message。

設定好後一樣重新啟動一個 Session。這時隨意開啟一個 git repo 就可以下:

# showLogs 日期 作者 
showLogs 2025-01-01 louis383

image-02.gif

是不是很棒呢?讀者可以發揮創意,自行建立好用的 Shell Script 直接放在裡頭囉。
接下來的章節和 GitHub 有關,我們下次見囉。

References


上一篇
Day24 進階觀念篇:上班族的 vim 生存手冊
系列文
上班族的命令列 (CLI) 生存手冊25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言