首頁 > 軟體

bash shell 自定義函數命令持久化生效問題

2023-04-02 06:01:48

1. 背景

每次登陸shell 遇到需要敲一行命令來檢視一個問題或者升級一個應用時就感覺很麻煩,可以考慮將函數放到特定的位置,這樣每次登陸shell時就會重新載入。

2. 登陸shell時讀取命令的流程

當你登入Linux系統時,bash shell會作為登入shell啟動。登入shell會從5個不同的啟動檔案裡讀取命令:

  • /etc/profile
  • $HOME/.bash_profile
  • $HOME/.bashrc
  • $HOME/.bash_login
  • $HOME/.profile

/etc/profile檔案是系統上預設的bash shell的主啟動檔案。系統上的每個使用者登入時都會執行這個啟動檔案。
另外4個啟動檔案是針對使用者的,可根據個人需求客製化。

2.1 /etc/profile

/etc/profile檔案是bash shell預設的的主啟動檔案。只要你登入了Linux系統,bash就會執行
/etc/profile啟動檔案中的命令

2.2 $HOME目錄下的啟動檔案流程

剩下的啟動檔案都起著同一個作用:提供一個使用者專屬的啟動檔案來定義該使用者所用到的環境變數。大多數Linux發行版只用這四個啟動檔案中的一到兩個:

  • $HOME/.bash_profile
  • $HOME/.bashrc
  • $HOME/.bash_login
  • $HOME/.profile

注意,這四個檔案都以點號開頭,這說明它們是隱藏檔案(不會在通常的ls命令輸出列表中
出現)。它們位於使用者的HOME目錄下,所以每個使用者都可以編輯這些檔案並新增自己的環境變
量,這些環境變數會在每次啟動bash shell對談時生效

shell會按照按照下列順序,執行第一個被找到的檔案,餘下的則被忽略:

  • $HOME/.bash_profile
  • $HOME/.bash_login
  • $HOME/.profile

注意,這個列表中並沒有$HOME/.bashrc檔案。這是因為該檔案通常通過其他檔案執行的。

.bash_profile啟動檔案會先去檢查HOME目錄中是不是還有一個叫.bashrc的啟動檔案。如果有的話,會先執行啟動檔案裡面的命令。

[zoms@chm ~]$ cat ~/.bash_profile
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

到這來可以看到 .bashrc 是如何引入啟動的。

3. 在命令列上使用函數

在命令列上建立函數
通過單行方式建立函數

[zoms@chm ~]$ function divem { echo $[ $1 / $2 ]; }
[zoms@chm ~]$ divem 100 5
20

3.1 在.bashrc 檔案中定義函數

在命令列上直接定義shell函數的明顯缺點是退出shell時,函數就消失了。對於複雜的函數來說,這可是個麻煩事。
一個非常簡單的方法是將函數定義在一個特定的位置,這個位置在每次啟動一個新shell的時候,都會由shell重新載入。
最佳地點就是.bashrc檔案。bash shell在每次啟動時都會在主目錄下查詢這個檔案,不管是互動式shell還是從現有shell中啟動的新shell。

3.1.1 直接定義函數

可以直接在主目錄下的.bashrc檔案中定義函數。許多Linux發行版已經在.bashrc檔案中定義了一些東西,所以注意不要誤刪了。把你寫的函數放在檔案末尾就行了。這裡有個例子。

 cat .bashrc 
# .bashrc 
# Source global definitions 
if [ -r /etc/bashrc ]; then 
 . /etc/bashrc 
fi 
function addem { 
 echo $[ $1 + $2 ] 
} 

該函數會在下次啟動新bash shell時生效。隨後你就能在系統上任意地方使用這個函數了。

3.1.2 讀取函數檔案

只要是在shell指令碼中,都可以用source命令(或者它的別名點操作符)將庫檔案中的函數新增到你的.bashrc指令碼中。

 cat .bashrc 
# .bashrc 
# Source global definitions 
if [ -r /etc/bashrc ]; then 
 . /etc/bashrc 
fi 
. /home/rich/libraries/myfuncs 

還可以在當前使用者下的.bashrc 檔案新增自定義別名和函數

[zoms@chm ~]$ cat ~/.bashrc
# .bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions
. /home/zoms/shell/zcm_update.sh

注意:source命令有個快捷的別名,稱作點操作符(dot operator)。要在shell指令碼中執行zcm_update庫檔案,只需新增下面這行:
. /home/zoms/shell/zcm_update.sh

zcm_update 可以定義引數傳參

[zoms@chm ~]$ cat  /home/zoms/shell/zcm_update.sh
zcm_update(){

 if [ $# -eq 0  ]
 then
   echo Parameter exception
   return 1
 fi
 echo $1
 sudo supervisorctl stop $1;sudo docker stop $1;sudo docker rm $1;sudo supervisorctl update $1;sudo supervisorctl start $1;sleep 3;sudo supervisorctl status $1
 echo sudo supervisorctl status $1
}

4. 驗證

# 改造前 
# 通過多條命令重建nms-monitor應用
sudo supervisorctl stop nms-test;sudo docker stop nms-test;sudo docker rm nms-test;sudo supervisorctl update nms-test;sudo supervisorctl start nms-test;sleep 3;sudo supervisorctl status nms-test
# 改造後
zcm_update nms-test

到此這篇關於bash shell 自定義函數命令持久化生效的文章就介紹到這了,更多相關bash shell 自定義函數命令內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com