1. 程式人生 > >ubuntu下環境變數詳解 profile environment

ubuntu下環境變數詳解 profile environment

在Ubuntu中有如下幾個檔案可以設定環境變數
 
/etc/profile:在登入時,作業系統定製使用者環境時使用的第一個檔案,此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行.
 
/etc/environment:在登入時作業系統使用的第二個檔案,系統在讀取你自己的profile前,設定環境檔案的環境變數
 
~/.profile:在登入時用到的第三個檔案是.profile檔案,每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當用戶登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變數,執行使用者的.bashrc檔案.
 
/etc/bashrc:為每一個執行bash shell的使用者執行此檔案.當bash shell被開啟時,該檔案被讀取.
 
~/.bashrc:該檔案包含專用於你的bash shell的bash資訊,當登入時以及每次開啟新的shell時,該該檔案被讀取.
 
通常設定環境變數有三種方法:
一、臨時設定
export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH
 
二、當前使用者的全域性設定
開啟~/.bashrc,新增行:
export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH
 
使生效
 
source .bashrc
三、所有使用者的全域性設定
$ vim /etc/profile
在裡面加入:
export PATH=/home/yan/share/usr/local/arm/3.4.1/bin:$PATH
使生效
source profile
 
測試 echo $PATH
 ######################################################################################
使用者登入後加載profile和bashrc的流程如下:


1)/etc/profile-------->/etc/profile.d/*.sh
2)$HOME/.bash_profile-------->$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/.bash_profile中,會在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/product/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 "(^|:)$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/product/imeg/etc/profile


export PS1="\[\e[32;1m\][\
[email protected]
\h]\[\e[33;1m\]:\[\e[31;1m\]\w>\\$ \[\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/product/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清一下螢幕

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

轉載網址:http://blog.sina.com.cn/s/blog_4b2169480100sklr.html

相關推薦

ubuntu環境變數 profile environment

在Ubuntu中有如下幾個檔案可以設定環境變數   /etc/profile:在登入時,作業系統定製使用者環境時使用的第一個檔案,此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行.   /etc/environment:在登入時作業系統使用的第二個檔案

Ubuntu系統環境變數

本文轉自https://www.linuxidc.com/Linux/2016-09/135476.htm   最近在研究ROS作業系統,有個系統變數ROS_PACKAGE_PATH的概念不是很理解,所以找到了這篇系統變數的詳解文章,一方面作為參考,另一方面分享出來-----

ubuntu環境變數檔案/etc/profile、.profile、.bashrc、/etc/bash.bashrc之間的區別和聯絡(轉)

寫在前面:不同的發行版裡面檔案的命名可能有所不同,如有的發行版etc目錄下有bashrc,有的發行版下面是bash.bashrc。這個根據每個人不同的發行版注意下具體的檔名稱。 /etc/profile:此檔案為系統的每個使用者設定環境資訊,當用戶第一次登入時,該檔案被執行.並從/etc/pro

Ubuntugrub配置

1 Grub簡介 1.1 GNU GRUB GNU GRUB(簡稱“GRUB”)是一個來自GNU專案的啟動載入程式. GRUB是多啟動規範的實現,它允許使用者可以在計算機內同時擁有多個作業系統,並在計算機啟動時選擇希望執行的作業系統。GRU

QMAKESPEC環境變數

相關知識 要講解QMAKESPEC環境變數的知識,先要了解如下知識 qmake.pro專案檔案makefile檔案 1.qmake qmake是用來為不同的平臺的開發專案建立Makefile的Trolltech開發一個易於使用的工具。手寫Makefile是比較困難並且容易出錯的,尤其是需要給不同的平臺和編

linux 中切換使用者:su和su -的使用環境變數

大部分Linux發行版的預設賬戶是普通賬戶,而更改系統檔案或者執行某些命令,需要root身份才能進行,這就需要從當前使用者切換到root使用者,Linux中切換使用者的命令是su或su - 前者只是切換root身份,但shell環境仍然是普通使用者的shell; 而後者連使

安裝Jdk、Maven、Tomcat與配置環境變數(Win10)

前言 本文針對於WIN10下JDK,Maven,Tomcat等常用開發工具的下載配置步驟作出詳解。Win7,Win8步驟類似。對於這些常用開發工具建議建立一個資料夾統一維護 由於,Maven,Tomcat等工具都是依賴與JDK,所以首先要安裝好JDK。話不多說

Ubuntutar命令使用

格式: tar 選項檔案目錄列表 功能: 對檔案目錄進行打包備份 選項: -c 建立新的歸檔檔案 -r 向歸檔檔案末尾追加檔案 -x 從歸檔檔案中解出檔案 可以這樣記憶,建立新的檔案是c,追加在原有檔案上用r,從檔案中解壓出用x -O 將檔案解開到標準輸出 -v 處理過程中輸出相關資訊 -f 對普通檔案操作 

Cypress系列(14)- 環境變數

如果想從頭學起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html   前言 環境變數,其實就是根據環境的變化,變數會有不同的值 比如最常見的:開發環境、測試環境、生產環境的 URL 肯定不一樣,我們可以根

.NET Core 環境變數

## 一、概述 軟體從開發到正式上線,在這個過程中我們會分為多個階段,通常會有開發、測試、以及上線等。每個階段對應的環境引數配置我們會使用不同的引數。比如資料庫的連線字串,開發環境一般我們都是連線的測試庫。以前這種情況通常是 COPY 兩個同名的配置檔案來進行處理,然後在本地就使用本地的配置,生產環境就使用

windows 環境變數 path

在學習JAVA的過程中,涉及到多個環境變數(environment variable)的概念,如PATH。正確地配置這些環境變數,是能夠順利學習、開發的前提。而經常出現的問題是:有的學習者能夠按照提示一步一步地正確配置,但時間一長就忘了,出現了問題也無從下手。究其原因,就是

Linux 環境變數/etc/profile、/etc/bashrc、~/.bashrc的區別

最近配置了JAVA和Scala的環境變數,發現自己對Linux下 /etc/profile、/etc/bashrc、~/.bashrc的區別不是特別清楚,特此查閱了相關資料,整理下來,供以後查閱。如有錯誤之處,還望各位朋友批評指正。 ①/etc/profile

Mac node安裝和環境配置(最新)

1、進入node官網下載頁http://nodejs.cn/download/       如下圖: 選擇macOS安裝程式下載,此為  10.12.0版本、 2、雙擊安裝程式安裝 如下: 顯示程式將會安裝的位置 一直點選繼續到最後為 3

Ubuntu 14.04安裝Gazebo

一、解除安裝當前已安裝的不能執行的gazebo相關包,具體方法如下:通過 “dpkg -l | grep gazebo”命令查詢當前安裝的gazebo包,然後通過“sudo apt-get remove gazebo7 gazebo7-common gazebo7-plugi

windows 64位,React-Native環境搭建 (Android)

React-Native環境搭建需要: 1、安裝Java JDK 2、安裝Android Studio 3、安裝node.js 4、安裝git 5、安裝Python 2.x (注意目前不支援Python 3版本) 6、安裝react-native-c

ubuntu 12.04配置變數後切換到root環境變數無效的解決辦法。

昨天在ubuntu12.04下安裝了androroid開發環境,並且在/etc/profile下添加了如下環境變數: #jdk export JAVA_HOME=/home/chase/jdk/jdk1.8 export JRE_HOME=/home/chase/jdk/

Appium+python自動化(二)- 環境搭建—(超

簡介    巨集哥的人品還算說得過去,雖然很久沒有搭建環境了,但是換了新電腦裝置,一氣呵成,將android的測試開發環境已經搭建準備完畢。上一篇android測試開發環境已經準備好, 那麼接下來就是appium的環境安裝和搭建了。 嘿嘿!巨集哥和小夥伴們開個玩笑,不要覺得自人品不好,就不會成功

linuxcat命令

forever ron localhost root sta testing 幫助 查看 一點 1、cat 顯示文件連接文件內容的工具; cat 是一個文本文件查看和連接工具。查看一個文件的內容,用cat比較簡單,就是cat 後面直接接文件名。 比如: de>[[

詳細的<select>拉列表

刷新 焦點 root 失去 收集 asc aid isa document 我們使用表單下拉列表選擇數據,如省、市、縣、年、月等數據,我們即可使用下拉菜單表單進行設置。select 我下拉列表菜單標簽Option為下拉列表數據標簽Value 為Option的數據值(用於數據

Vue.js 運行環境搭建(基於windows的手把手安裝教學)及vue、node基礎知識普及

頁面 沒有 全能 服務器程序 重載 帶來 size 耐心 編程   Vue.js 是一套構建用戶界面的漸進式框架。他自身不是一個全能框架——只聚焦於視圖層。因此它非常容易學習,非常容易與其它庫或已有項目整合。在與相關工具和支持庫一起使用時,Vue.j