本文從shell執行的角度分析export變量的生命周期
# 只對當前shell環境起作用,比如通過不同的遠程ssh就是不同的shell環境
export k=v
當運行一個.sh文件或者是shell命令,shell會把當前的環境變量都復制過來,也就是子類和父類的關系。通過以下幾個場景解釋這個概念。
證明父能影響子
- 直接運行命令export K=V,然后echo $K,能看到輸出了V
- 寫一個shell腳本,echo $K,能看到輸出了V
證明子不能影響父
- 在一個shell腳本中export K=V,然后echo $K,能看到輸出了V。
- 基於1,直接運行命令echo $K,發現輸出為空
如果想讓shell腳本中執行的環境變量影響到父環境,那么可以用source來執行
source xxx.sh
因為source的腳本是在當前環境下執行的,也就是說沒有用子shell來執行(默認用sh xxx.sh是新建一個子shell來運行)。這樣就可以讓腳本中更改的環境變量影響到系統環境變量。但也只是當前ssh連接下的環境變量,其他連接依然不受影響。如果要更改全局的環境變量,那么可以在/etc/profile中添加export xxxx,更改完后source /etc/profile
如果想刪除該變量,可以用unset xxxx
總結
- Linux運行shell腳本是按類似繼承的方式獲取環境變量
- 如果想讓運行的腳本在當前環境執行,則用source,注意:如果在腳本中又調用了其他腳本也遵循這個邏輯,即用source運行的其他腳本使用當前環境,sh運行的采用子環境
- 以上都是臨時的,如果要重啟機器不丟失變量則需要寫入文件/etc/profile