Linux學習-- su -和 su的區別深入解析
一、簡單介紹
交互式: 直接通過終端輸入賬號密碼登錄等
變量,別名等不會繼承上一級shell,都會重新讀取
非交互式:圖形化界面下打開的終端,執行腳本,任何其它的bash實例等
變量,別名等會繼承上一級shell,然後讀取文件
二、相關文件
我們先看下這五個文件主要內容
/etc/profile :存放著系統中已經存在的環境變量,如PATH,USER
/etc/profile.d/*.sh :存放著許多顏色的設置,vim的設置等
~/.bash_profile :文件中的內容表示指向~/.bashrc
~/.bashrc :文件中的內容表示指向/etc/bashrc
/etc/bashrc :設置變量的相關內容
profile類 | 交互式登錄的shell提供配置 |
bashrc類 | 非交互式和交互式登錄的shell提供配置 |
用戶登錄時文件讀取順序:
交互式:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互: ~/.bashrc --> --> /etc/bashrc --> /etc/profile.d/*.sh
三、結合案例剖析
①在/etc/profile添加export A=A1
在/etc/profile.d/下vim mage.sh,添加內容export B=B2
在~lisi/.bash_profile添加export C=C3(確保lisi這個用戶存在)
在~lisi/.bashrc下添加export D=D4
在/etc/bashrc下添加export E=E5
註:所有變量都添加在第一行,不包括註釋行
②重新登錄 su - root
echo $A;echo $B;echo $C;echo $D;echo $E(當前是登錄root用戶,按照文件讀取順序,所以會跳過~lisi/.bash_profile和~lisi/.bashrc)
結果顯示:A1 B2 E5
③/etc/profile下A1改成A6
再次echo $A;echo $B;echo $C;echo $D;echo $E(由於A保存的還是上次登錄的變量,不會顯示A6)
結果顯示:A1 B2 E5
④su root
echo $A;echo $B;echo $C;echo $D;echo $E(非交互式登錄root,按照非交互式讀取文件順序,同樣會跳過~lisi/.bashrc,當前非交互式(子shell)會繼承上 一級登錄shell,所以A的值還是A1)
結果顯示:A1 B2 E5
⑤exit(退出子shell,回到上級shell,就是su root是進入了一個子shell)
echo $A;echo $B;echo $C;echo $D;echo $E
結果顯示:A1 B2 E5
⑥vim /etc/profile.d/mage.sh 將B2改為B7
su root(按照非交互式順序,會讀取/etc/profile.d/mage.sh)
結果顯示:A1 B7 E5
⑦exit
echo $A;echo $B;echo $C;echo $D;echo $E
結果顯示:A1 B2 E5
⑧su lisi
echo $A;echo $B;echo $C;echo $D;echo $E
結果顯示:A1 B7 D4 E5
⑨exit
su - lisi
echo $A;echo $B;echo $C;echo $D;echo $E(按照交互式讀取順序,而且交互式不會繼承上一級登錄shell的變量,)
結果顯示:A6 B7 C3 D4 E5
小tip:執行腳本也是在子shell下運行的,子shell會繼承父shell的變量(非交互式)
父shell繼承不了子shell的文件
上面已經說了:執行腳本也是非交互式登錄,在腳本中定義的變量在腳本外(父shell下)不會生效
但是source+腳本 或者 .+腳本 就是在當前shell(父shell下)下運行和bash+腳本(子shell下)的方法有本質區別
Linux學習-- su -和 su的區別深入解析