1. 程式人生 > >Linux學習-- su -和 su的區別深入解析

Linux學習-- su -和 su的區別深入解析

讀取 4.6 用戶 ble 運行 系統 export 非交互 交互

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的區別深入解析