#[喵咪Linux(2)]環境變量的坑#java
##前言##linux
玩過linux的童鞋對環境變量都不陌生,咱們在安裝好一些軟件,組件以後想要直接使用它都須要加入環境變量,而且好比java啊golang都必須依賴你設置的環境變量來運行,在最近筆者在平常工做中遇到了一些關於環境變量的坎,因此今天把這些"坑"分享出來和你們交流!golang
附上:shell
喵了個咪的博客:w-blog.cnbash
##1. 兩場景##服務器
筆者有個習慣就是喜歡追問場景,好比別人問我一個問題,token要怎麼用sign要怎麼玩,我都會先問你是什麼場景,什麼場景才使用什麼技術,簡單或複雜,因此這樣不例外咱們先來了解一下,筆者遇到的兩個場景分表是什麼ssh
###1.1 場景一###工具
筆者在使用supervison的時候須要使用root權限才能去執行一些命令,使用了發佈工具無法直接獲得root的權限,確定也不能直接開發全部用戶能夠登陸到root(風險很大),因此打算用ssh經過來獲取root的權限執行命令,這個時候我使用了以下命令:ui
ssh root@localhost "supervisorctl restart xxxxx"rest
可是這個時候意外的返回了找不到命令bash: supervisorctl: command not found,我經過ssh鏈接上去是能夠執行的是沒有問題的
###1.2 場景二###
第二個場景是在使用go的時候遇到的,我也是須要發佈go程序,而後使用部署的這個用戶去build程序而後執行,這個時候竟然提示了go命名不存在,這個時候很納悶,按照約定是在/etc/profile裏面配置好了應該配置的目錄了啊,在root下面也是沒有任何問題.
抱着懷疑的心態我把服務器reboot了一下,神奇的事情發生了root的go命名也無法使用了
##2. 出了什麼問題?##
看是上面這兩個場景,都是跨用戶去執行命令的時候出現了找不到命令,只有一個東西能夠解釋這個問題,就是環境變量.
後面我試着經過env來查看環境變量,個人發佈用戶的環境變量比root少了一截,那咱們就開始定位問題把,這個時候就不得不說Linux的環境變量的幾種形式了
**/etc/profile:**此文件爲系統的每一個用戶設置環境信息,當用戶第一次登陸時,該文件被執行並從/etc/profile.d目錄的配置文件中搜集shell的設置.
**/etc/bashrc:**爲每個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取
**~/.bash_profile:**每一個用戶均可使用該文件輸入專用於本身使用的shell信息,當用戶登陸時,該文件僅僅執行一次!默認狀況下,他設置一些環境變量,執行用戶的.bashrc文件.
**~/.bashrc:**該文件包含專用於你的bash shell的bash信息,當登陸時以及每次打開新的shell時,該
###2.1 場景一###
瞭解這上面這四種Linux獲取環境變量的機制就不難解釋場景一的問題了,你們能夠看到除了/etc/bashrc除外的裏面都有一個前提條件,當用戶登錄時,若是你先登陸到ssh是確定沒有問題的觸發了登陸操做,環境變量都會加載進來,可是若是是使用ssh root@localhost "xxxx" 後面帶命令的形式的時候這個時候是不會觸發login的只是單純的執行一下命令就釋放了,這個時候惟一能加載的環境變量就是/etc/bashrc因此須要去/etc/bashrc進行一下配置就ok了
###2.2 場景二###
場景二的問題就比較奇怪了,個人go環境變量是配置到/etc/profile中的理論上來講是不會出現我在這類問題的,之因此在reboot以前root可使用是由於在配置好環境變量以後執行了source /etc/profile,解決方法仍是和場景一的同樣把環境變量移到/etc/bashrc中,在/etc/bashrc中的環境變量基本能夠保證會加載進來
##3. 總結##
在不少時候教程啊等等指導的環境變量配置每每是在/etc/profile中,因此也就會有這一些奇奇怪怪的問題,你們之後配置環境變量能夠經過你的不一樣的影響範圍配置到不一樣地方能夠實現不一樣的影響範圍,你們get到了嗎!
注:筆者能力有限有說的不對的地方但願你們可以指出,也但願多多交流!