由host $ export DVSDK="${HOME}/ti-dvsdk_dm368-evm_xx_xx_xx_xx"引發的問題
1、${HOME}:首先, HOME 是個變量,它代表你的 home 目錄,變量前必須加上 $ 符號,否則會報錯
usr/local/dvsdk為dvsdk的destination folder 由#echo $DVSDK測試環境變量添加成功否
Linux export 命令
功能說明:設置或顯示環境變量。(比如我們要用一個命令,但這個命令的執行文件不在當前目錄,這樣我們每次用的時候必須指定執行文件的目錄,麻煩,在代碼中先執行export,這個相當於告訴程序,執行某某東西時,需要的文件或什么東東在這些目錄里)
語 法:export [-fnp][變量名稱]=[變量設置值]
補充說明:在shell中執行程序時,shell會提供一組環境變量。 export可新增,修改或刪除環境變量,供后續執行的程序使用。export的效力僅及於該此登陸操作。
參 數:
-f 代表[變量名稱]中為函數名稱。
-n 刪除指定的變量。變量實際上並未刪除,只是不會輸出到后續指令的執行環境中。
-p 列出所有的shell賦予程序的環境變量。
一個變量創建時,它不會自動地為在它之后創建的shell進程所 知。而命令export可以向后面的shell傳遞變量的值。當一個shell腳本調用並執行時,它不會自動得到原為腳本(調用者)里定義的變量的訪問 權,除非這些變量已經被顯式地設置為可用。export命令可以用於傳遞一個或多個變量的值到任何后繼腳本。 ----《UNIX教程》
在 linux 里設置環境變量的方法 ( export PATH )
一般來說,配置交叉編譯工具鏈的時候需要指定編譯工具的路徑,此時就需要設置環境變量。例如我的mips-linux-gcc編譯器在“/opt/au1200_rm /build_tools/bin”目錄下,build_tools就是我的編譯工具,則有如下三種方法來設置環境變量:
1、直接用export命令:
#export PATH=$PATH:/opt/au1200_rm/build_tools/bin
查看是否已經設好,可用命令export查看:
[root@localhost bin]#export
declare -x BASH_ENV="/root/.bashrc"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="localhost.localdomain"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="zh_CN.GB18030"
declare -x LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD="/opt/au1200_rm/build_tools"
declare -x PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/opt/au1200_rm/build_tools/bin"
declare -x PWD="/opt/au1200_rm/build_tools/bin"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_AUTH_SOCK="/tmp/ssh-XX3LKWhz/agent.4242"
declare -x SSH_CLIENT="10.3.37.152 2236 22"
declare -x SSH_CONNECTION="10.3.37.152 2236 10.3.37.186 22"
declare -x SSH_TTY="/dev/pts/2"
declare -x TERM="linux"
declare -x USER="root"
declare -x USERNAME="root"
可以看到灰色部分有設置的路徑,說明環境變量已經設好,PATH里面已經有了我要加的編譯器的路徑。
2、修改profile文件:
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
3. 修改.bashrc文件:
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
后兩種方法一般需要重新注銷系統才能生效,最后可以通過echo命令測試一下:
看看輸出里面是不是已經有了 /my_new_path這個路徑了。
另有:4. 修改/etc/re.local文件:
# vi /etc/re.local
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"
-----------------------------------------------------------------------------------------------------------------------
“/bin”、“/sbin”、“ /usr/bin”、“/usr/sbin”、“/usr/local/bin”等路徑已經在系統環境變量中了,如果可執行文件在這幾個標准位置,在終端命令行輸入該軟件可執行文件的文件名和參數(如果需要參數),回車即可。
如果不在標准位置,文件名前面需要加上完整的路徑。不過每次都這樣跑就太麻煩了,一個“一勞永逸”的辦法是把這個路徑加入環境變量。命令 注意,與DOS/Window不同,UNIX類系統環境變量中 格式如下():
# 軟件名-版本號
PATH=$PATH:路徑1:路徑 2:...:路徑n
其他環境變量=$其他環境變量:...
在“profile”和“.bash_profile”中,“#”是注釋符號,寫在這里除了視覺分隔外沒有任何效果。
設置完畢,注銷並重新登錄,設置就生效了。如果不注銷,直接在shell里執行這些語句,也能生效,但是作用范圍只限於執行了這些語句的shell。
相關的環境變量生效后,就不必老跑到軟件的可執行文件目錄里去操作了。
-----------------------------------------------------------------------------------------------------------------------
執行一個腳本時,會先開啟一個子shell環境(不知道執行其它程序是不是這樣),然后將父shell中的所有系統環境變量復制過來,這個腳本中的 語句就在子shell中執行。(也就是說父shell的環境變量在子shell中可以調用,但反過來就不行,如果在子shell中定義了環境變量,則只對 該shell或者它的子shell有效,當該子shell結束時,也可以理解為腳本執行完時,變量消失。)為了證明這一點,請看腳本內容:
test=’value’
export test
這樣的腳本執行完后,test實際上是不存在的。接着看下面的:
test=’value’
export test
bash
這里在腳本最后一行再開一個子shell,該shell應該是腳本文件所在shell的子shell,這個腳本執行完后,是可以看到test這個變量的,因為現在是處於它的子shell中,當用exit退出子shell后,test變量消失。
如果用source對腳本進行執行時,如果不加export,就不會在子shell中看到這個變量,因為它還不是一個系統環境變量呀,如腳本內容是:
test=’value’
用source執行后,在shell下是能看到這個變量,但再執行bash開一個子shell時,test是不會被復制到子shell中的,因為執行 腳本文件其實也是在一個子shell中運行,所以我再建另一個腳本文件執行時,是不會輸入任何東西的,內容如:echo $test。所以這點特別注意了,明明在提示符下可以用echo $test輸出變量值,為什么把它放進腳本文件就不行了呢?
所以得出的結論是:1、執行腳本時是在一個子shell環境運行的,腳本執行完后該子shell自動退出;2、一個shell中的系統環境變量才會被 復制到子shell中(用export定義的變量);3、一個shell中的系統環境變量只對該shell或者它的子shell有效,該shell結束時 變量消失(並不能返回到父shell中)。3、不用export定義的變量只對該shell有效,對子shell也是無效的。
后來根據版主的提示,整理了一下貼子:為什么一個腳本直接執行和用source執行不一行呢?這也是我自己碰到的一個問題。manual原文是這樣 的:Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.明白了為什么不一樣了吧?直接執行一個腳本文件是在一個子shell中運行的,而source則是在當前shell環境中運行的。