iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 7
1
Software Development

Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單系列 第 7

Day07-Prompt 大改造(一)

前言

如昨天所說,目前 Gosh 的 prompt 真的太醜了,就只有一個簡單的 >,連路徑都沒有顯示,根本不知道怎麼用

看看隔壁棚的 zsh,不僅該有的功能都有,甚至還加上了顏色,看起來就賞心悅目,看到這麼美的終端機一整天的心情都好了起來

Gosh vs Zsh

醜不拉嘰的 Gosh,連作者我本人都不忍直視

五彩繽紛、科技感十足的 Zsh

今日目標

所謂「人要衣裝,佛要金裝」,就算功能輸給 Zsh 也不可以長得太醜,所以今天要來給他大改造,至少改善一下第一印象XD

實作

會用到的 function

如上面 zsh 的圖,如果要做出好看的 prompt 就會需要 username、hostname 等等資訊,因為這些資料是在系統內部,所以一定要透過 System Call 跟系統拿(下圖 System Calls 箭頭)

以下三個 function 就是已經包裝好的 System Call,只要使用這些 function,Go 就會自動處理跟系統溝通的部分,開發者只要負責用就可以了,簡單吧~

  • os.Getwd()

    os 是負責 Operating System(作業系統)相關操作的 package,裡面放的都是包裝好的 System Call,其中 os.Getwd() 是用來取得目前路徑(Working Directory),相當於 pwd 指令

  • os.Hostname()

    os.Hostname() 就是字面上的意思:用來跟 OS(Operating System) 要這台電腦的主機名稱,相當於 hostname 指令做的事情

  • user.Current()

    os/user 是 Go 中處理使用者資訊相關的 package,他也是 os 的 subpackage,其中的 user.Current 可以取得目前使用者的資訊,相當於 whoami 指令

showPrompt

因為 prompt 的內容越來越複雜,所以把 prompt 的部分獨立出來

func showPrompt() {
    u, _ := user.Current()    // 取得使用者資訊
    host, _ := os.Hostname()  // 取得主機名稱
    wd, _ := os.Getwd()       // 取得 Working Directory

    // 把字串組合起來放到 Prompt 中
    fmt.Printf("%s@%s %s > ", u.Username, host, wd)
}

func main() {
    stdin := bufio.NewReader(os.Stdin)

    for {
        showPrompt()
        
        // ...
    }
}

Demo

終於有目前路徑了~~

小結

今天稍微講了 System Call 的觀念,因為 Go 都已經包裝好了所以實作上沒什麼難度,就只是使用 System Call 取得想要的資訊並且呈現出來,commit 放在 這邊 請有需要的客倌自行取用

雖然 prompt 有好看一點了,但跟 zsh 比起來好像還少了點生命力,我想一定是顏色的關係對吧!既然如此明天就來幫Shell上色吧~~

延伸閱讀


上一篇
Day06-執行指令(二)
下一篇
Day08-Prompt 大改造(二)
系列文
Gosh!原來用 Go 寫一個 Unix Shell 這麼簡單30

尚未有邦友留言

立即登入留言