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就不生效了,不知道神馬原因? export?http_proxy=http://192.168.1.105:8080
解決方法: source?test.sh 不要直接采用 sh test.sh
參考文獻 [1].http://bbs.chinaunix.net/thread-2323631-1-1.html?這個提問和我遇到的問題是一樣的,期待解決方案 [2].http://www.oschina.net/question/147332_131625? 同樣的問題 [3].http://blog.163.com/shi_shun/blog/static/237078492011112643525868/? sh和source 腳本的區別
才發現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就不生效了,不知道神馬原因? export?http_proxy=http://192.168.1.105:8080
解決方法: source?test.sh 不要直接采用 sh test.sh
參考文獻 [1].http://bbs.chinaunix.net/thread-2323631-1-1.html?這個提問和我遇到的問題是一樣的,期待解決方案 [2].http://www.oschina.net/question/147332_131625? 同樣的問題 [3].http://blog.163.com/shi_shun/blog/static/237078492011112643525868/? sh和source 腳本的區別
總結
以上是生活随笔為你收集整理的shell设置系统环境变量的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Ubuntu 14.04.3上安装py
- 下一篇: 在CentOS 6.3 64bit上安装