程式員的自我修養——Linux下的環境變數原理與shell 概述:在linux下工作,經常會出現這樣的情況:1)運行某個命令,出現提示-bash:【commandname】:command not found2)執行某個ELF可執行檔:xyz@hnode02:~/Downloads/software/bean/workdir>./bean.exe./bean.exe:error while loading shared libraries: libTreePlayer.so: cannot openshared object file: No such file or directory 當出現cannotfound,nosuch file,cannotopen這類字眼的時候,往往是由於相關的環境變數沒有有效設定(也有可能是由於沒有安裝相關的庫或者程式)。本文針對這類問題,主要講解了環境變數的本質原理,設定方法,以及出現相關問題的解決方案。 1.什麼是環境變數 1.1知其所以然 環境變數就是系統或軟體佈建的一些參數,使用者環境變數就是使用者登入系統後,都有自已專用的運行環境。當你登入shell環境以後,shell會自動讀取/etc/profile ~/.profile ~/.bashrc /.bash_profile等檔案,這些檔案中往往有相關的環境變數的設定和初始化。環境表(指向實際name=value字串的指標數組)和環境字串通常存放在進程儲存空間的頂部(棧之上),因此子進程會繼承父進程的環境變數。相應的問題就是:為什麼我在命令列裡面設定了相關的環境變數之後,環境變數生效,但是重新啟動一個終端,這個環境變數缺失效了呢?linux下提供了三個系統調用,來修改環境變數:#include<stdlib.h>intputenv(char *str);int setenv(const char *name, const char*value, int rewrite);int unsetenv(const char *name);1.2常見的環境變數及其作用 PATH 決定了shell將到哪些目錄中尋找命令或程式HOME 目前使用者主目錄HISTSIZE 記錄數LOGNAME 目前使用者的登入HOSTNAME 指主機的名稱SHELL 前使用者Shell類型LANGUGE 語言相關的環境變數,多語言可以修改此環境變數MAIL 目前使用者的郵件存放目錄PS1 基本提示符,對於root使用者是#,對於普通使用者是$PS2 附屬提示符,預設是“>”LD_LIBRARY_PATH動態連結程式庫的路徑 以上這些都是系統內容變數,往往在非使用者相關的檔案中進行設定,一般都用大寫;使用者環境變數一般用小寫,放在使用者相關目錄之中。 2.如何設定與查看環境變數 2.1設定一個新的環境變數:$export HELLO="Hello!"$echo $HELLOHello! 2.2查看環境變數:顯示環境變數HOME$echo $HOME/home/redbooks 2.3.使用env命令顯示所有的環境變數 $env HOSTNAME=redbooks.safe.org PVM_RSH=/usr/bin/rsh Shell=/bin/bash TERM=xterm HISTSIZE=1000 2.4.使用set命令顯示所有本地定義的Shell變數 $set BASH=/bin/bash BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu") BASH_VERSION='2.05b.0(1)-release' COLORS=/etc/DIR_COLORS.xterm COLUMNS=80 DIRSTACK=() DISPLAY=:0.0 ... 2.5.使用unset命令來清除環境變數 set可以設定某個環境變數的值。清除環境變數的值用unset命令。如果未指定值,則該變數值將被設為NULL。樣本如下: $export TEST="Test..." #增加一個環境變數TEST $env|grep TEST #此命令有輸入,證明環境變數TEST已經存在了 TEST=Test... $unset $TEST #刪除環境變數TEST $env|grep TEST #此命令沒有輸出,證明環境變數TEST已經存在了 2.6.使用readonly命令設定唯讀變數 如果使用了readonly命令的話,變數就不可以被修改或清除了。樣本如下: $export TEST="Test..." #增加一個環境變數TEST $readonly TEST #將環境變數TEST設為唯讀 $unset TEST #會發現此變數不能被刪除 -bash:unset: TEST: cannot unset: readonly variable $TEST="New" #會發現此也變數不能被修改 -bash:TEST: readonly variable 環境變數的設定位於/etc/profile檔案 如果需要增加新的環境變數可以添加下屬行 exportpath=$path:/path1:/path2:/pahtN注意:以上這些命令只有在當前進程與子孫進程中有效,如果想要永久修改,需要修改相關設定檔,然後source這些設定檔,使得它們生效。 3.環境變數相關問題的解決方案 回到概述中提到的兩個問題,當出現-bash:【commandname】:command notfound,這種提示的時候,利用find命令找到相關的commandname可執行檔的位置,然後把路徑添加到PATH之中即可。對於第二個問題,處理方法類似,不過需要修改的環境變數變成了LD_LIBRARY_PATH. 4.參考關於設定檔的資訊和如何修改PAHT,可參考部落格:bash初探和PATH詳解http://www.bkjia.com/os/201304/203701.html