1. $home變數從**獲得的?
home 本身是 shell 來設定的,你可以自己手工設定(例如使用 bash 的 export),也可以在 shell 的初始化檔案中設定(例如 bash 的 .bash_profile 或者 .profile)。但是,除非你知道自己在做什麼,還是不要修改它的好。
既然home本身是shell來設定的,那麼shell從**讀到這個配置呢?答案是/etc/passwd,例如:
jack:x:501:501:jack:/home/jack:/bin/bash
當使用者登入時密碼驗證後,讀取該資訊。
2. bash_profile與bashrc的區別,login-shell與non login-shell, 互動式shell。
/etc/profile:
此檔案為系統的所有使用者設定全域性
環境變數,
只要你登入了linux系統,bash就會執行/etc/profile檔案中的命令。profile檔案會逐一訪問位於/etc/profile.d目錄的每乙個檔案,它為linux系統提供了乙個集中存放使用者登入時需要執行的應用專屬的啟動檔案的地方。
~/.bash_profile:每個使用者都可使用該檔案輸入專用於自己使用的shell初始化資訊,當使用者登入時,該檔案被執行。 一般設定讓它呼叫使用者的~/.bashrc檔案.
上面這兩個檔案會在以login-shell形式啟動bash shell時執行。
/etc/bashrc:
只會在每次有新的互動式shell啟動時,該檔案才會執行,也就是在~/.bashrc指令碼中被呼叫,預設檔案中會設定一些環境變數,但是它並沒有執行export命令讓他們成為全域性的。
~/.bashrc
:該檔案包含專用於你的bash shell的bash資訊,每次以non login-shell模式即互動式shell啟動時,該檔案被讀取.
[root@win jack]# cat.bash_profile# .bash_profile
# get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi# user specific environment and startup programs
path=$path:$home/bin
export path
[root@win jack]# cat那什麼是login-shell?什麼是nonlogin-shell和互動式shell呢?這個問題剛開始很讓我困擾。因為我平時都是直接登入到linux圖形介面,開啟shell的方面都是使用terminal終端開啟的。.bashrc# .bashrc
# source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi# user specific aliases and functions
這裡作出解釋。
login-shell:就是通過非圖形介面進行登入,例如ctrl+alt+f[ 2-7 ]切換到tty1~tty6登入時, 需要輸入使用者名稱和密碼,此時取得的bash就稱為login shell。
這個過程會執行以下檔案:
-------->/etc/profile-----------> $home/.bash_profile如果有$home/.bash_login和 $home/.profile檔案也會執行 (我系統中沒有這兩個檔案)
根據我的.bash_profile檔案的設定,在.bash_profile檔案中會呼叫 $home/.bashrc-------------->/etc/bashrc
也就是說,在我的機器中,用login-shell啟動shell,檔案的執行順序是這樣:
/etc/profile ----------> $home/.bash_profile -----------> $home/.bashrc ----------> /etc/bashrc
non login-shell,互動式shell,就是我們最常用,需要注意的是
interactive non-login shell從其父程序上繼承過來環境變數。
舉三個例子(1)以x window登入linux後,再以x 的圖形化介面啟動終端機,此時那個終端機並不需要再次的輸入使用者名稱和密碼,那個bash的環境就稱為non-login shell
(2)在原本的bash環境中再次下達bash這個指令,同樣沒有要求輸入使用者名稱和密碼,那個第二個bash也是non-login shell
(3)通過su命令切換使用者獲取的bash也是non-login shell。
如果bash是互動式non login-shell啟動的,它不會去訪問/etc/profile檔案,而是去使用者的home目錄檢查.bashrc時候存在。過程:
-----------> $home/.bashrc -----------> /etc/bashrc
由於non login-shell不是從非圖形介面直接登入的,所以這個程序一定有父程序,而父程序某個父程序為登入程序,執行過/etc/profile和.bash_profile檔案,因為/etc/profile中通過export設定的是全域性的環境變數,子程序自然得到繼承。
所以在通過互動式shell形式獲取bash時,雖然沒有去執行/etc/profile檔案,但是依然擁有這些環境變數。
所以non login-shell中實際擁有,/etc/profile和$home/.bash_profile中的設定的所有全域性環境變數(區域性環境變數得不到繼承),以及$home/.bashrc,/etc/bashrc中設定的所有環境變數。
對此我做出了實驗:
[jack@win ~]$ cat.bashrc# .bashrc
# source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi# user specific aliases and functions
echo
".bashrc has been executed.
"
[jack@win ~]$ cat在.bashrc 和.bash_profile檔案中分別加上了一行測試語句。測試發現,當我們新起乙個互動式shell的時候和su命令切換到oracle使用者的時候(我也新增了類似的測試語句),發現都是只執行了.bashrc指令碼。.bash_profile# .bash_profile
# get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi# user specific environment and startup programs
path=$path:$home/bin
export path
echo
"bash_profile has been executed
"
linux 環境變數詳解
1 總結背景 2 變數簡介 linux 是乙個多使用者的作業系統 每個使用者登入系統後,都會有乙個專用的執行環境。通常每個使用者預設的環境都是相同的,這個預設環境實際上就是一組環境變數的定義。使用者可以對自己的執行環境進行定製,其方法就是修改相應的系統環境變數。3 定製環境變數 環境變數是和 she...
Linux環境變數詳解
環境變數的本質就是變數,它的服務物件是shell程式,它分為區域性環境變數和全域性環境變數,分別有不同的作用域和自然生命週期 不同的情況下,會產生不同的shell。既然環境變數是服務於shell程式的,那麼就來分析一下不同角色的shell 使用export匯出的環境變數,就是全域性環境變數 在 et...
linux 環境變數詳解
全域性環境變數 對於shell會話和它生成的所有子shell都是可見的。區域性環境變數 只在建立他們的shell中可見。全域性和區域性變數是否可以用我們程式語言中的父類和子類來幫助了解?檢視全域性變數的值 1 printenv 檢視所有全域性變數的值,printenv 變數名 檢視指定變數名的全域性...