1. 程式人生 > >shell設定系統環境變數的問題

shell設定系統環境變數的問題

業務場景: 我在一個bash指令碼中修改了PATH變數的內容,並將其儲存到/etc/profile檔案中,同時執行了 source /etc/profile 但是當指令碼退出時,我發現PATH變數還是沒有修改生效,但是,如果我在命令列再直接執行 source /etc/profile
才發現PATH生效了。 請問,這是什麼原因呢? 經過參閱《鳥哥的私房菜》中的相關內容p.307,export和source,總結的知識點是: 1.自定義變數和環境變數的區別,兩者的差異就在於是否會被子程序所繼續引用 2.當你登陸Linux並取得一個bash之後,你的bash就是一個獨立的程序,接下來你在這個bash下面執行的任何命令都是由這個bash所衍生的子程序, 3.子程序僅會繼承父程序的環境變數,但不會繼承父程序的自定義變數,當子程序返回時,父程序的自定義變數依然有效 4.要讓子程序繼承父程序的自定義變數,需要將自定義變數變成環境變數,使用export命令 5.source命令即點(.)命令。source命令是在當前程序中執行引數檔案中的各個命令,而不是另起子程序(或sub-shell)。
exec命令也不產生新的子程序。那麼exec與source的區別是什麼呢? exec命令在執行時會把當前的shell process關閉,然後換到後面的命令繼續執行。 shell中source和sh script的區別 有兩種方法執行shell scripts,一種是新產生一個shell,然後執行相應的shell scripts;一種是在當前shell下執行,不再啟用其他shell。 新產生一個shell然後再執行scripts的方法是在scripts檔案開頭加入以下語句 #!/bin/sh 一般的script檔案(.sh)即是這種用法。這種方法先啟用新的sub-shell(新的子程序),然後在其下執行命令。 另外一種方法就是上面說過的source命令,不再產生新的shell,而在當前shell下執行一切命令。 問題分析:
環境變數(傳給子程序的變數,遺傳性是本地變數和環境變數的根本區別)只能單向從父程序傳給子程序。不管子程序的環境變數如何變化,都不會影響父程序的環境變數。 你在shell中呼叫的指令碼,然後在指令碼中呼叫source,設定的環境變數只對當前的shell指令碼所在程序及由這個指令碼fork的子程序中有效 然後你在shell中做其他操作的時候,之後設定的環境變數就不起作用了。 網上查到的同樣的問題: export命令為什麼在shell指令碼中執行不生效? 在伺服器上執行如下命令是可以生效的,但是我把語句放在腳本里,如test.sh,然後我執行sh test.sh就不生效了,不知道神馬原因? 解決方法:
source test.sh 不要直接採用 sh test.sh 參考文獻