當前位置:
首頁 > 知識 > ubuntu環境變數的三種設置方法

ubuntu環境變數的三種設置方法

一:設置環境變數的三種方法

1.1 臨時設置

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

  • 1

1.2 當前用戶的全局設置

打開~/.bashrc,添加行:

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

  • 1

使生效:

source .bashrc

  • 1

1.3 所有用戶的全局設置

$ vim /etc/profile

  • 1

在裡面加入:

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

  • 1

使生效

source profile

  • 1

二: 測試當前的環境變數

echo $PATH

env

  • 1
  • 2
  • 3

用戶登錄後載入profile和bashrc的流程如下:

1. /etc/profile

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

2. $HOME/.bash_profile

->$HOME/.bashrc

->/etc/bashrc

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

說明:

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

  • 1
  • 2
  • 3
  • 4
  • 5

如果是超級用戶登錄,在/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/.bash

p

rofile中,會在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

  • 1
  • 2

以alice用戶(普通用戶)為例

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

  • 1

三:腳本解析

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

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

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

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

  • 1
  • 2
  • 3
  • 4

3.1 打開的文件如下:

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

3.2 腳本解析說明

3.2.1 第一部分

從1-21行基本是打開動態鏈接庫文件和身份驗證的文件.

3.2.2 第二部分

第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 "(^|:)$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變數上加入/sbin/,/usr/sbin,/usr/local/sbin三個目錄-q "(^|:)($|:)"

#因為調用pathmunge函數,沒有加入after參數,所以以上三個目錄都加在了$PATH變數的最前面

# Path manipulation

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

pathmunge /sbin

pathmunge /usr/sbin

pathmunge /usr/local/sbin

fi

#調用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=$USER

MAIL="/var/spool/mail/$USER"

#通過/bin/hostname獲取主機名

#定義history的記錄數為1000

HOSTNAME=`/bin/hostname`

HISTSIZE=1000

#如果沒有定義$INPUTRC並且不存在$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 "$i" ]; then

. $i

fi

done

unset i

. /ceno/prod t/imeg/etc/profile

export PS1="[e[32;1m][u@h][e[33;1m]:[e[31;1m]w>\$ [e[0m]"

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76

3.2.3 第三部分

從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"

  • 1
  • 2
  • 3
  • 4
  • 5

3.2.4 第四部分

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

3.2.5 第五部分

第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文件

3.2.6 第六部分

在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 使用的與輸入相關的庫

3.2.7 第七部分:

第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清一下屏幕

ubuntu環境變數的三種設置方法

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

IntelliJ遠程調試詳解
遞歸函數及匿名函數配合內置函數的使用

TAG:程序員小新人學習 |