日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 重读环境变量,关于linux中使用source /etc/profile重新读取配置后,新的环境变量只能在当前终端里面有效,新开的终端提示 command not found...

發(fā)布時間:2024/9/27 linux 46 豆豆

文章目錄

問題

知識點

問題分析及解決

補充

問題

在使用linux桌面環(huán)境(通常是ubuntu/debian/deepin等版本的linux)的時候,新增環(huán)境變量后,會使用source /etc/profile命令使新的環(huán)境變量立刻生效而不用重新啟動系統(tǒng)。但經(jīng)常會遇到使用source /etc/profile命令之后,新的環(huán)境變量只能在當前終端里面有效,而在新打開的終端中,使用新的環(huán)境變量就找不到了。

先通過操作來復(fù)現(xiàn)一下這個過程,我使用的linux分支是deepin(其他版本的類似),通過圖形界面打開終端操作進入,準備添加一個新的變量testEnv。

# 查看系統(tǒng)中,是否已經(jīng)存在名字為 testEnv 的環(huán)境變量,如果輸出為空,表示環(huán)境變量不存在

echo $testEnv

# 環(huán)境變量不存在,就添加 testEnv 到環(huán)境變量

sudo bash -c "echo testEnv=888888 >> /etc/profile"

# 輸出/etc/profile最后一行,查看是否添加成功

tail -1 /etc/profile

# testEnv=888888

# 使 testEnv 環(huán)境變量生效

source /etc/profile

# 查看環(huán)境變量 testEnv 的值,如果輸出 888888 ,表示環(huán)境變量創(chuàng)建成功

echo $testEnv

# 888888

新建一個終端窗口,看下是否可以輸出環(huán)境變量testEnv的值。

# 輸出結(jié)果為空

echo $testEnv

但是,只要重啟系統(tǒng),一切就正常了。

問題在于為什么?

知識點

我們知道,linux中環(huán)境變量是通過配置文件添加的,在系統(tǒng)啟動的時候,通過加載不同的配置文件來初始化環(huán)境變量,所以環(huán)境變量找不到的問題,歸根結(jié)底是配置文件的加載問題。搞清楚linux中配置文件的加載順序,上面遇到的問題也就不難理解了。

shell是用戶與Linux系統(tǒng)進行交互的媒介,它在運行時具有兩種屬性,即“交互”與“登陸”,由此衍生出交互式登錄和非交互式登錄兩種模式。

交互式登錄shell進程是指直接通過某終端輸入賬號密碼后登錄打開的shell進程,如使用ssh或者堡壘機進行遠程主機連接,或者使用 su - username 或者 su -l username 執(zhí)行的登錄用戶切換等。

非交互式登錄shell進程:圖形界面下打開的終端、su username 執(zhí)行的登錄切換、直接運行腳本或者bash -c執(zhí)行一段命令的時候。

linux 中常見的配置文件有/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc和/etc/profile.d/*。

/etc/profile:此文件為系統(tǒng)的每個用戶設(shè)置環(huán)境信息,系統(tǒng)中每個用戶登錄時都要執(zhí)行這個腳本,如果系統(tǒng)管理員希望某個設(shè)置對所有用戶都生效,可以寫在這個腳本里,該文件也會從/etc/profile.d目錄中的配置文件中搜集shell的設(shè)置。

~/.bash_profile:每個用戶都可使用該文件設(shè)置專用于自己的shell信息,當用戶登錄時,該文件僅執(zhí)行一次。默認情況下,他設(shè)置一些環(huán)境變量,執(zhí)行用戶的.bashrc文件。

~/.bashrc:該文件包含專用于自己的shell信息,當?shù)卿洉r以及每次打開新shell時,該文件被讀取。

/etc/bashrc:為每一個運行bash shell的用戶執(zhí)行此文件,當bash shell被打開時,該文件被讀取。

關(guān)于配置文件加載順序的說法,網(wǎng)上有很多,看起來也不盡相同,其實主要區(qū)別在與不同的linux發(fā)行版,包含的配置文件也是有很大區(qū)別的,即使有名字相同的配置文件,配置文件里面的內(nèi)容也是大相徑庭。但是基本上所有的linux發(fā)行版都會包括/etc/profile(登錄后讀取的第一個配置文件)和~/.bashrc兩個配置文件。

對于交互式登錄shell來說,一定會讀取的配置文件的順序是/etc/profile --> ~/bashrc。

對于非交互式登錄shell來說,一定會讀取的配置文件屬性是~/.bashrc,如果~/.bash_profile 存在的話,順序是這樣的~/.bash_profile --> ~/.bashrc 。

對于其他的各種常見配置文件的讀取,以及是讀取,主要取決于/etc/profile 或者 ~/bashrc 里面的具體內(nèi)容,比如在centos7 的/etc/profile中有如下一段代碼,是用來載入/etc/profile.d/*.sh配置文件的。

for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do

if [ -r "$i" ]; then

if [ "${-#*i}" != "$-" ]; then

. "$i"

else

. "$i" >/dev/null

fi

fi

done

deepin系統(tǒng)中的.bashrc里面有一段代碼,用來讀取命令別名聲明文件。

# Get the aliases and functions

if [ -f ~/.bash_aliases ]; then

. ~/.bash_aliases

fi

所以,系統(tǒng)配置文件的讀取順序,需要根據(jù)系統(tǒng)版本的不同去了解讀取順序。

每次在配置文件中配置的新環(huán)境變量,只會對隨后新啟動的shell進程生效,如果想讓配置文件立即生效,需要讓shell進程重讀配置文件,這就需要進行類似source /etc/profile 或者 . /etc/profile 這樣的操作。

問題分析及解決

一般遇到本文開頭說到的問題的同學(xué),都是在圖形界面下使用終端的配置的環(huán)境變量,然后通過source /etc/profile 重新讀取配置文件,然后打開一個新的終端的時候,使用命令就是出現(xiàn)comand not found的問題。

結(jié)合上面的知識點看下,在圖形界面下使用的終端屬于非交互式登錄的shell,以我使用的deepin系統(tǒng)為例,新開一個終端時,讀取的配置文件應(yīng)該是~/.bashrc。而新增的環(huán)境變量配置在/etc/profile,所以出現(xiàn)在新開終端找不到環(huán)境變量的問題。

解決辦法:

在新開終端,執(zhí)行source /etc/profile,比較麻煩

將環(huán)境變量配置在,~/.bashrc 中,可以解決

在~/.bashrc中添加source /etc/profile,這樣就可以為每一個新開的終端重新讀取一次/etc/profile配置文集,可以解決,多次讀取/etc/profile沒有發(fā)現(xiàn)有什么副作用。

補充

網(wǎng)上早期很多關(guān)于java、node等的環(huán)境變量配置的文章,感覺都是針對搭建centos服務(wù)器或者測試機的,他們之所以沒有這個問題,是因為服務(wù)器基本都是通過ssh遠程登錄,是交互式登錄模式的,每次打開一個新的遠程連接,都會重新讀取/etc/profile,所以不會有command not found的問題。而個人用的電腦,基本都是圖形界面直接操作,所以會遇到比較多的這種問題。

總結(jié)

以上是生活随笔為你收集整理的linux 重读环境变量,关于linux中使用source /etc/profile重新读取配置后,新的环境变量只能在当前终端里面有效,新开的终端提示 command not found...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。