最近在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:
從該圖可以看出,文字模式登入,讀取的環境變數檔案是:/etc/profile->/etc/bash.bashrc->~/.profile->~/.bashrc
在普通使用者模式下,鍵入su命令,進入root使用者,然後echo $a
可以看到,在上一步的基礎上重新讀取了/etc/bash.bashrc檔案和root使用者自身的~/.bashrc檔案
在root使用者環境下,鍵入su - mllabs -c 'echo $a'
可以看到,只讀取了/etc/profile檔案和~/.profile兩個檔案,說明su - user命令相當登入型非互動式shell
在root使用者環境下,鍵入su - mllabs -c 'source /home/mllabs/.bashrc && echo $a'
輸出的還是:
為什麼source /home/mllabs/.bashrc 命令會失效呢,一開始百思不得其解
後來在檢視~/.bashrc檔案內容中發現,這樣一條命令
case $- in
*i*) ;;
*) return ;;
esac
這一段**是判斷當前shell是否為互動型shell,所以就算手動執行source /home/mllabs/.bashrc,也不能將.bashrc檔案中的環境變數讀取到。
再談bash example.sh
在這裡我新建了乙個測試指令碼
#test.sh
#!/bin/bash
echo $a
在這個指令碼中輸出變數a的值
同時,在終端也輸出a的值
可以發現a的值是沒有 變化的,這就說明bash test.sh命令是新建乙個子程序,這個子程序是完全繼承當前的父程序,並不屬於互動型shell,所以並沒有觸發環境變數的讀取
Ubuntu16 04系統美化
預設中國伺服器,我們將其換成aliyun的 在設定 語言支援中,進行更新 2.解除安裝不常用的軟體 1.sudo apt get remove thunderbird totem rhythmbox empathy brasero scan gnome mahjongg aisleriot 3.su...
Ubuntu16 04 開發環境配置
sudo apt get install vimvim python 請參考vim與python真乃天作之合。官網 sudo add apt repository ppa damien moore codeblocks stable sudo apt get update sudo apt get ...
ubuntu 16 04 搭建fabric環境
1 安裝go環境 2 安裝docker 參考 1 更新apt安裝包索引 sudo apt get update 2 安裝軟體包以允許apt通過https使用儲存庫 3 新增docker官方的gpg金鑰 curl fssl sudo apt key add 4 確保現在系統已經擁有金鑰指紋的後八個字串...