最近在ubuntu系統中做一個關於程序開機自啓動的問題
由於環境變量在不同的運行模式下讀取的流程不一樣,導致在服務器開機重啓後運行既定程序找不到相應的環境變量錯誤
這裏做一篇博客來探討一下環境變量的讀取過程
首先,要明確幾個概念,登錄型shell和非登錄型shell,交互型shell(interactive shell) 和非交互型shell(non-interactive shell)
登錄型shell:簡單來說, 就是在終端輸入用戶名和密碼後得到的shell
非登錄型shell:簡單來說,就是在圖形界面或者文字界面鍵入(strl+alt+t)或者Bash命令得到的一個新窗口
交互型shell:簡單來說,就是需要用戶在圖形或者文本界面下需要鍵入命令和shell進行交互
非交互型shell:簡單來說,就是執行一個sh腳本,eg:bash example.sh
首先,聲明一點的是ubuntu 16.04系統家目錄下(~目錄),與環境變量相關的文件只有.bashrc .bash_logout .profile
在系統目錄下有兩個文件:/etc/profile和/etc/bash.bashrc
首先在/etc/profile文件裏:export a='/etc/profile'
同樣的,在/etc/bash.bashrc文件中設置export a='/etc/bash.bashrc'
同樣的,在~/.profile文件中設置export a='/home/mllabs/.profile',因爲普通用戶是mllabs
同樣的,在~/.bashrc文件中設置export a='/home/mllabs/.bashrc'
準備工作就緒,下面登錄賬戶mllabs
在shell界面echo $a:
從該圖可以看出,文本模式登錄,讀取的環境變量文件是:/etcc/profile->/etc/bash.bashrc->~/.profile->~/.bashrc
在普通用戶模式下,鍵入su命令,然後echo $a
可以看到,在上一步的基礎上重新讀取了/etc/bash.bashrc文件和root用戶自身的~/.bashrc文件
在root用戶環境下,鍵入su - mllabs -c 'echo $a'
可以看到,只讀取了/etcc/profile文件和~/.profile兩個文件,說明su - user命令相當登錄型非交互式shell