shell 腳本實戰筆記(2)--環境變量PATH的恩怨情仇


  在linux環境下, 相信大家對環境變量PATH, 多多少少有所接觸, 這邊講講PATH的在linux的前世因緣.

  先講講一個列子
  假如我們在為一個新的應用配置其PATH路徑中時,  不小心忽略了原先的$PATH內容, 把原本的PATH=/path/to/newcmd:$PATH, 寫成了PATH=/path/to/newcmd, 並不小心寫入了~/.bashrc, 並且source ~/.bashrc.
  這時會發生什么? 我們如何去處理這種情況?

  

  所有的命令都不能用了, 想回去編輯~/.bashrc, 可惜為時已晚, vim命令找不到了.
  究其本質的原因:

  

  此時, 你想到的解決方法是什么?
  重新登錄? 呵呵.

  
  要讓大家失望了, 還是不行, linux新建會話, 都會為登錄用戶構建相應的環境變量, 最后會執行source ~/.bashrc, 依舊導致PATH為空.

  如何破, 先看下shell的命令分類. 實際上shell命令分兩種, 內嵌命令和外部命令. 內嵌命令是shell自帶的, 而外部命令是shell通過環境變量PATH去查找.
  怎么區分, 一個命令到底是shell內嵌, 還是外部命令?

   

  type命令能很好的區分一個命令的分類屬性, 比如cd, read, printf, 包括type命令自身皆為內嵌命令, 而ls, cat等則為外部命令.

  由於PATH被設置為空, 導致shell無法查到該外部命令所在的路徑, 自然不能執行, 但是該命令的二進制文件依舊存在, 因此可以指定其絕對路徑來執行, 就可以.

  

  去除誤設置的環境變量PATH, 同時重新登錄即可.

  

  重新export 環境變量PATH亦可, 通過vi命令, 對bashrc變量進行設置, 然后重新登錄.

  linux的登錄會話生效時, 會先執行/etc/profile文件(該文件對所有用戶都生效), 然后執行用戶相關的${HOME}/.bashrc文件. 那/etc/profile中, 主要對環境變量作了那些工作? 

  查閱/etc/profile文件

  1). 首先定義了pathmunge函數, 該函數對環境變量PATH, 進行追加相關路徑操作.

 1 pathmunge () {
 2     case ":${PATH}:" in
 3         *:"$1":*)
 4             ;;
 5         *)
 6             if [ "$2" = "after" ] ; then
 7                 PATH=$PATH:$1
 8             else
 9                 PATH=$1:$PATH
10             fi
11     esac
12 }

  2). 設置用戶的EUID, 標識實際的登錄用戶ID, 對於root用戶, id默認為0

 1 if [ -x /usr/bin/id ]; then
 2     if [ -z "$EUID" ]; then
 3         # ksh workaround
 4         EUID=`id -u`
 5         UID=`id -ru`
 6     fi
 7     USER="`id -un`"
 8     LOGNAME=$USER
 9     MAIL="/var/spool/mail/$USER"
10 fi

  3). 依據EUID, 對環境變量PATH進行相關路徑的追加

 1 # Path manipulation
 2 if [ "$EUID" = "0" ]; then
 3     pathmunge /sbin
 4     pathmunge /usr/sbin
 5     pathmunge /usr/local/sbin
 6 else
 7     pathmunge /usr/local/sbin after
 8     pathmunge /usr/sbin after
 9     pathmunge /sbin after
10 fi

  這邊可以看出, 不同的用戶, 指定不同的路徑. 這在線上系統, 對不同用戶和角色設置不同的PATH對應的路徑, 是有必要的.

  4). 最后進行相關的環境變量的導出

1 HOSTNAME=`/bin/hostname 2>/dev/null`
2 HISTSIZE=1000
3 if [ "$HISTCONTROL" = "ignorespace" ] ; then
4     export HISTCONTROL=ignoreboth
5 else
6     export HISTCONTROL=ignoredups
7 fi
8 
9 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL

  這就是系統默認的環境變量, PATH, USER, LOGNAME, MAIL, HOSTNAM等的來源

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM