開發 Shell 命令

rexmolo發表於2018-07-24

前提

​ 工作中我們經常遇到很多重複的事情,例如最近我就遇到一個,在debug的時候需要經常到專案裡面的logs資料夾下面檢視日誌,基於這個前提再加上想把之前看linux的一些知識應用一下,寫了一個命令,效率倍感提升。

指令碼超連結: github

什麼是Shell

​ 雖說這個不需要解釋了,但是這裡還是要佔個位,以便不知道的人,通過這個標題去 baidu google查詢自己需要的知識

囉嗦

​ 我認為看這篇文章的人,說明對類 unix 系統的執行流程不太瞭解。

​ 另外這篇文章是基於 Mac 系統講解的,對於類 unix 系統應該差別不會太大

我一直認同的一個觀點,一定要了解程式執行背後的原理,在這裡給大家簡單介紹一下我個人認為在開發 shell 過程中應該瞭解的,方便大家理解並記憶,我本人的知識範圍有限,有描述不清楚或者不對的地方還請指正。

​ 我們將在下面通過編寫一個例項來進行講解,目標編寫一個自己的命令,這個命令是為了滿足我每天 debug 的時候需要檢視日誌檔案

命令、變數、檔案

命令

export 在這裡您可以理解為設定一個環境變數,例如:export PATH="/usr/local/sbin:$PATH"

source 當你的 .bash_profile 檔案變更了,需要用 sorce .bash_profile 重新載入一遍

變數

$PATH 系統環境變數,你可以簡單的理解一些目錄的集合,通過 echo $PATH 可以看到

$HOME 當前使用者的家目錄

檔案

.bashrc or .bash_profile 使用者個人的啟動檔案。可以用來擴充套件或重寫全域性配置指令碼中的設定。

​ 你可以在你的終端命令列輸入 echo; ls -al; 會進入到你的家目錄下面列出所有檔案(包括隱藏檔案),在不同的類 unix 系統中他們的名字可能不太一樣,通常會有一些以 . 開頭的檔案

shell 如何載入?

​ 我們今天自制一個稱為 plogs 的命令 , 當在你的終端輸入 plogs 或者任何你想開發的終端命令的時候或許會報出類似如下的錯誤:

command not found: plog

​ 這個錯誤的原因是終端沒有在 $PATH 環境中找到這個命令

​ 另外通常你想要開發一個命令的時候可以用 type [your command] 來檢測一下是否存在於系統中, 以免你自己的命令覆蓋掉系統的命令, 類似下面,就是檢測了系統中是否存在一個 p 命令

$ type p
p not found

如果這個命令存在,會表現成如下這樣子:

# rex @ HR in ~ [11:09:22] C:1
$ type ls
ls is an alias for ls -G

# rex @ HR in ~ [11:10:32]
$ type plogs
plogs is /Users/rex/bin/plogs

​ 當你執行 plogs 這個命令的時候的時候系統要去 $PATH 這個目錄集合裡面挨個去找,有沒有一個可執行的命令檔案,例如上面就是在 /Users/rex/bin 下面找到了匹配的可執行檔案

那如何新增你存放可執行檔案的目錄放到 $PATH 中呢?你可以在你的 .bash_profile (可能你的系統中叫其他名字) 檔案中加上這麼一行 $HOME/bin,這樣你就可以將你的命令執行檔案放在 家目錄下面的 bin 目錄裡面了。

那為什麼要放在 bin 目錄中呢?因為bin目錄通常是類 unix 系統存放可執行檔案的地方