天天看點

ubuntu下設定環境變量的三種方法【轉】

通常設定環境變量有三種方法:

一、臨時設定

export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH

二、目前使用者的全局設定

打開~/.bashrc,添加行:

使生效

source .bashrc

三、所有使用者的全局設定

$ vim /etc/profile

在裡面加入:

source profile

測試目前的環境變量;

測試 echo $PATH

使用者登入後加載profile和bashrc的流程如下:

1)/etc/profile-------->/etc/profile.d/*.sh

2)HOME/.bashprofile−−−−−−−−>HOME/.bashprofile−−−−−−−−>HOME/.bashrc---------->/etc/bashrc

說明:

bash首先執行/etc/profile腳本,/etc/profile腳本先依次執行/etc/profile.d/*.sh

随後bash會執行使用者主目錄下的.bash_profile腳本,.bash_profile腳本會執行使用者主目錄下的.bashrc腳本,

而.bashrc腳本會執行/etc/bashrc腳本

至此,所有的環境變量和初始化設定都已經加載完成.

bash随後調用terminfo和inputrc,完成終端屬性和鍵盤映射的設定.

其中PATH這個變量特殊說明一下:

如果是超級使用者登入,在沒有執行/etc/profile之前,PATH已經設定了下面的路徑:

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

如果是普通使用者,PATH在/etc/profile執行之前設定了以下的路徑:

/usr/local/bin:/bin:/usr/bin

這裡要注意的是:在使用者切換并加載變量,例如su -,這時,如果使用者自己切換自己,比如root使用者再用su - root切換的話,加載的PATH和上面的不一樣.

準确的說,是不總是一樣.是以,在/etc/profile腳本中,做了如下的配置:

if [ `id -u` = 0 ]; then

pathmunge /sbin

pathmunge /usr/sbin

pathmunge /usr/local/sbin

fi

如果是超級使用者登入,在/etc/profile.d/krb5.sh腳本中,在PATH變量搜尋路徑的最前面增加/usr/kerberos/sbin:/usr/kerberos/bin

如果是普通使用者登入,在/etc/profile.d/krb5.sh腳本中,在PATH變量搜尋路徑的最前面增加/usr/kerberos/bin

在/etc/profile腳本中,會在PATH變量的最後增加/usr/X11R6/bin目錄

在HOME/.bashprofile中,會在PATH變量的最後增加HOME/.bashprofile中,會在PATH變量的最後增加HOME/bin目錄

以root使用者為例,最終的PATH會是這樣(沒有其它自定義的基礎上)

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

以alice使用者(普通使用者)為例

/usr/kerberos/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/alice/bin

下面是做的腳本解析:

###############################################

#strace -o su -e trace=open su - alice

#grep ^open /etc/su|grep -v null|grep "= 3"|nl

打開的檔案如下:

1    open("/etc/ld.so.cache", O_RDONLY)      = 3

2    open("/lib/libcrypt.so.1", O_RDONLY)    = 3

3    open("/lib/tls/libc.so.6", O_RDONLY)    = 3

4    open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

5    open("/etc/nsswitch.conf", O_RDONLY)    = 3

6    open("/etc/ld.so.cache", O_RDONLY)      = 3

7    open("/lib/libnss_files.so.2", O_RDONLY) = 3

8    open("/etc/passwd", O_RDONLY)           = 3

9    open("/etc/shadow", O_RDONLY)           = 3

10    open("/etc/group", O_RDONLY)            = 3

11    open("/etc/ld.so.cache", O_RDONLY)      = 3

12    open("/lib/libtermcap.so.2", O_RDONLY)  = 3

13    open("/lib/libdl.so.2", O_RDONLY)       = 3

14    open("/lib/tls/libc.so.6", O_RDONLY)    = 3

15    open("/dev/tty", O_RDWR|O_NONBLOCK|O_LARGEFILE) = 3

16    open("/etc/mtab", O_RDONLY)             = 3

17    open("/proc/meminfo", O_RDONLY)         = 3

18    open("/etc/nsswitch.conf", O_RDONLY)    = 3

19    open("/etc/ld.so.cache", O_RDONLY)      = 3

20    open("/lib/libnss_files.so.2", O_RDONLY) = 3

21    open("/etc/passwd", O_RDONLY)           = 3

22    open("/etc/profile", O_RDONLY|O_LARGEFILE) = 3

23    open("/etc/profile.d/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3

24    open("/etc/profile.d/colorls.sh", O_RDONLY|O_LARGEFILE) = 3

25    open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3

26    open("/etc/profile.d/glib2.sh", O_RDONLY|O_LARGEFILE) = 3

27    open("/etc/profile.d/gnome-ssh-askpass.sh", O_RDONLY|O_LARGEFILE) = 3

28    open("/etc/profile.d/krb5.sh", O_RDONLY|O_LARGEFILE) = 3

29    open("/etc/profile.d/lang.sh", O_RDONLY|O_LARGEFILE) = 3

30    open("/etc/sysconfig/i18n", O_RDONLY|O_LARGEFILE) = 3

31    open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE) = 3

32    open("/usr/lib/gconv/gconv-modules.cache", O_RDONLY) = 3

33    open("/etc/profile.d/less.sh", O_RDONLY|O_LARGEFILE) = 3

34    open("/etc/profile.d/qt.sh", O_RDONLY|O_LARGEFILE) = 3

35    open("/etc/profile.d/vim.sh", O_RDONLY|O_LARGEFILE) = 3

36    open("/etc/profile.d/which-2.sh", O_RDONLY|O_LARGEFILE) = 3

37    open("/ceno/prod t/imeg/etc/profile", O_RDONLY|O_LARGEFILE) = 3

38    open("/home/alice/.bash_profile", O_RDONLY|O_LARGEFILE) = 3

39    open("/home/alice/.bashrc", O_RDONLY|O_LARGEFILE) = 3

40    open("/etc/bashrc", O_RDONLY|O_LARGEFILE) = 3

41    open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3

42    open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3

43    open("/etc/termcap", O_RDONLY)          = 3

44    open("/etc/inputrc", O_RDONLY|O_LARGEFILE) = 3

45    open(".", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY) = 3

46    open("/home/alice/.bash_logout", O_RDONLY|O_LARGEFILE) = 3

47    open("/home/alice/.bash_history", O_WRONLY|O_APPEND|O_LARGEFILE) = 3

48    open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3

########################################################

第一部分:

從1-21行基本是打開動态連結庫檔案和身份驗證的檔案.

第二部分:

第22行是打開/etc/profile檔案,如下:

# /etc/profile

# System wide environment and startup programs, for login setup

# Functions and aliases go in /etc/bashrc

#定義pathmunge函數

#echo PATH|/bin/egrep−q"(|:)PATH|/bin/egrep−q"(|:)1(|:)"是過濾|:)"是過濾PATH中的可執行目錄,如果egrep到批配項,傳回真但取反

#也就是不增加執行目錄到PATH中,選項-q禁止所有的輸出到标準輸出,不管比對行。如果選中輸入行,以 0 狀态退出 #這裡由 | (豎線)或者換行符隔開的多個正規表達式會比對與任何一個正規表達式所比對的字元串 #一個正規表達式可以被包括在“()”(括弧)中進行分組 ########################################################  pathmunge () { if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi fi }  ########################################### #如果uid為0的使用者,将在PATH中,選項-q禁止所有的輸出到标準輸出,不管比對行。如果選中輸入行,以 0 狀态退出 #這裡由 | (豎線)或者換行符隔開的多個正規表達式會比對與任何一個正規表達式所比對的字元串 #一個正規表達式可以被包括在“()”(括弧)中進行分組 ########################################################  pathmunge () { if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then if [ "$2" = "after" ] ; then PATH=$PATH:$1 else PATH=$1:$PATH fi fi }  ########################################### #如果uid為0的使用者,将在PATH變量上加入/sbin/,/usr/sbin,/usr/local/sbin三個目錄-q "(^|:)(|:)" #因為調用pathmunge函數,沒有加入after參數,是以以上三個目錄都加在了|:)" #因為調用pathmunge函數,沒有加入after參數,是以以上三個目錄都加在了PATH變量的最前面

###########################################

# Path manipulation

##########################################

#調用pathmunge函數,在PATH後面增加/usr/X11R6/bin ########################################## pathmunge /usr/X11R6/bin after  unset pathmunge  ########################################## #ulimit設定-S為軟控制,-c為core file檔案大小,這裡是不做限制 ########################################## # No core files by default ulimit -S -c 0 > /dev/null 2>&1  ########################################## #id -un是列印輸出目前的使用者名,例如:root #定義了LOGNAME變量和MAIL變量,會有程式用到這些變量 ########################################## USER="`id -un`" LOGNAME=PATH後面增加/usr/X11R6/bin ########################################## pathmunge /usr/X11R6/bin after  unset pathmunge  ########################################## #ulimit設定-S為軟控制,-c為core file檔案大小,這裡是不做限制 ########################################## # No core files by default ulimit -S -c 0 > /dev/null 2>&1  ########################################## #id -un是列印輸出目前的使用者名,例如:root #定義了LOGNAME變量和MAIL變量,會有程式用到這些變量 ########################################## USER="`id -un`" LOGNAME=USER

MAIL="/var/spool/mail/USER"   ########################################## #通過/bin/hostname擷取主機名 #定義history的記錄數為1000 ########################################## HOSTNAME=`/bin/hostname` HISTSIZE=1000   ########################################## #如果沒有定義USER"   ########################################## #通過/bin/hostname擷取主機名 #定義history的記錄數為1000 ########################################## HOSTNAME=`/bin/hostname` HISTSIZE=1000   ########################################## #如果沒有定義INPUTRC并且不存在HOME/.inputrc檔案 #定義變量INPUTRC的值為/etc/inputrc ########################################## if [ -z "HOME/.inputrc檔案 #定義變量INPUTRC的值為/etc/inputrc ########################################## if [ -z "INPUTRC" -a ! -f "HOME/.inputrc" ]; then INPUTRC=/etc/inputrc fi  export REMOTE_JAVA_DEBUG=on export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC  ########################################## #執行/etc/profile.d/下的所有腳本,-r是确認它們可讀 ########################################## for i in /etc/profile.d/*.sh ; do if [ -r "HOME/.inputrc" ]; then INPUTRC=/etc/inputrc fi  export REMOTE_JAVA_DEBUG=on export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC  ########################################## #執行/etc/profile.d/下的所有腳本,-r是确認它們可讀 ########################################## for i in /etc/profile.d/*.sh ; do if [ -r "i" ]; then

. ifidoneunseti./ceno/prodt/imeg/etc/profileexportPS1="\[\e[32;1m\][\u@\h]\[\e[33;1m\]:\[\e[31;1m\]\w>ifidoneunseti./ceno/prodt/imeg/etc/profileexportPS1="\[\e[32;1m\][\u@\h]\[\e[33;1m\]:\[\e[31;1m\]\w>

\e[0m\e[0m

"

第三部分:

從24行到36行是執行/etc/profile.d/下的所有腳本,這個執行過程在/etc/profile中定義.

見前面/etc/profile中的腳本分析.

下面是對/etc/profile.d/下腳本做的簡要說明,主要設定了環境變量(例如:PATH),alias等

/etc/profile.d/colorls.sh:對/etc/DIR_COLORS的提取,并用dircolors進行設定,最後定義了一些ls的alias

/etc/profile.d/glib2.sh:設定G_BROKEN_FILENAMES=1

/etc/profile.d/gnome-ssh-askpass.sh:設定SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass

/etc/profile.d/krb5.sh:增加/usr/kerberos/bin或/usr/kerberos/sbin到PATH變量中

/etc/profile.d/lang.sh:設定語言環境,首先會加載/etc/sysconfig/i18n中的環境變量(LANG,SUPPORTED,SYSFONT)到shell中,

根據以上的變量再定義語言環境支援子集,最後再根據LANG設定終端

/etc/profile.d/less.sh:設定LESSOPEN="|/usr/bin/lesspipe.sh %s",LANGVAR=$LANG

/etc/profile.d/qt.sh:設定QTDIR="/usr/lib/qt-3.1"

/etc/profile.d/vim.sh:設定alias vi=vim

/etc/profile.d/which-2.sh:設定alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

第四部分:

第37行open("/ceno/prod t/imeg/etc/profile", O_RDONLY|O_LARGEFILE) = 3,這裡加載了使用者自己的環境設定腳本.

第五部分:

第38行open("/home/alice/.bash_profile", O_RDONLY|O_LARGEFILE) = 3

第39行open("/home/alice/.bashrc", O_RDONLY|O_LARGEFILE) = 3

第40行open("/etc/bashrc", O_RDONLY|O_LARGEFILE) = 3

第一步:bash打開/home/alice/.bash_profile檔案,

第二步:.bash_profile檔案再判斷有無/home/alice/.bashrc,如果有加載.bashrc檔案

第三步:最後通過.bashrc檔案加載/etc/bashrc檔案

第六部分:

在41行open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3

在42行open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3

在43行open("/etc/termcap", O_RDONLY)          = 3

在44行open("/etc/inputrc", O_RDONLY|O_LARGEFILE) = 3

第一步打開.bash_history檔案準備記錄指令

第二步打開termcap檔案

terminfo 資料庫用于定義終端和列印機的屬性及功能,包括各裝置(例如,終端和列印機)的行數和列數以及要發送至該裝置的文本的屬性

第三步打開inputrc

inputrc 檔案為特定的情況處理鍵盤映射,這個檔案被 Readline 用作啟動檔案,Readline 是 Bash 和其它大多數 shell 使用的與輸入相關的庫

第七部分:

第46行open("/home/alice/.bash_logout", O_RDONLY|O_LARGEFILE) = 3

第47行open("/home/alice/.bash_history", O_WRONLY|O_APPEND|O_LARGEFILE) = 3

第48行open("/home/alice/.bash_history", O_RDONLY|O_LARGEFILE) = 3

這裡是使用者用logout或exit退出的表現.如果直接關閉掉terminal,則不會執行.bash_logout和寫回.bash_history檔案

.bash_logout腳本預設是調用clear清一下螢幕

<a href="http://keyewan.blog.163.com/blog/static/18982723320117775554554/" target="_blank">http://keyewan.blog.163.com/blog/static/18982723320117775554554/</a>

本文轉自張昺華-sky部落格園部落格,原文連結:http://www.cnblogs.com/sky-heaven/p/5186249.html,如需轉載請自行聯系原作者