天天看點

Visual Studio 2008 、 Windows 環境變量介紹 和 如何在檔案中引用環境變量 .

Visual Studio 2008  和 Windows 環境變量對設定 相對路徑很重要,這樣便于代碼的移植,即使換一台計算機,代碼不用更改配置,直接就能用。

可以在項目的“工具”“屬性頁”對話框中任何接受字元串的位置使用這些宏。這些宏不區分大小寫。 

說明

$(RemoteMachine)

$(Configuration)

目前項目配置的名稱(例如“Debug”)。

$(Platform)

目前項目平台的名稱(例如“Win32”)。

$(RootNameSpace)

包含應用程式的命名空間(如果有)。

$(IntDir)

為中間檔案指定的相對于項目目錄的目錄路徑。此路徑應具有尾部斜杠。這解析為 Intermediate Directory 屬性的值。

$(OutDir)

輸出檔案目錄的路徑,相對于項目目錄。此路徑應具有尾部斜杠。這解析為 Output Directory 屬性的值。

$(DevEnvDir)

Visual Studio 2010 的安裝目錄(定義為驅動器 + 路徑);包括尾部反斜杠“/”。

$(ProjectDir)

項目的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜杠“/”。

$(ProjectPath)

項目的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 檔案擴充名)。

$(ProjectName)

項目的基名稱。

$(ProjectFileName)

項目的檔案名(定義為基本名稱 + 檔案擴充名)。

$(ProjectExt)

項目的檔案擴充名。它包括“.”在檔案擴充名之前。

$(SolutionDir)

解決方案的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜杠“/”。

$(SolutionPath)

解決方案的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 檔案擴充名)。

$(SolutionName)

解決方案的基名稱。

$(SolutionFileName)

解決方案的檔案名(定義為基本名稱 + 檔案擴充名)。

$(SolutionExt)

解決方案的檔案擴充名。它包括“.”在檔案擴充名之前。

$(TargetDir)

生成的主輸出檔案的目錄(定義形式:驅動器 + 路徑);包括尾部的反斜杠“/”。

$(TargetPath)

生成的主輸出檔案的絕對路徑名(定義形式:驅動器 + 路徑 + 基本名稱 + 檔案擴充名)。

$(TargetName)

生成的主輸出檔案的基本名稱。

$(TargetFileName)

生成的主輸出檔案的檔案名(定義為基本名稱 + 檔案擴充名)。

$(TargetExt)

生成的主輸出檔案的檔案擴充名。它包括“.”在檔案擴充名之前。

$(VSInstallDir)

安裝 Visual Studio 2010 的目錄。 

此屬性包含目标 Visual Studio 的版本,該版本可能與宿主 Visual Studio 不同。例如,在使用 $(PlatformToolset) = v90 進行生成時,$(VSInstallDir) 包含 Visual Studio 2008 安裝位置的路徑。

$(VCInstallDir)

安裝 Visual C++ 2010 的目錄。 

此屬性包含目标 Visual C++ 的版本,該版本可能與宿主 Visual Studio 不同。例如,在使用 $(PlatformToolset) = v90 進行生成時,$(VCInstallDir) 包含 Visual C++ 2008 安裝位置的路徑。

$(FrameworkDir)

安裝 .NET Framework 的目錄。

$(FrameworkVersion)

Visual Studio 使用的 .NET Framework 版本。與 $(FrameworkDir) 相結合,就是 Visual Studio 使用的 .NET Framework 版本的完整路徑。

$(FrameworkSDKDir)

安裝 .NET Framework 的目錄。.NET Framework 可能已作為 Visual Studio 2010 的一部分安裝,也可能單獨安裝。

$(WebDeployPath)

$(WebDeployRoot)

指向 <localhost> 位置的絕對路徑。例如,c:/inetpub/wwwroot。

$(FxCopDir)

fxcop.cmd 檔案的路徑。fxcop.cmd 檔案不和所有的 Visual C++ 版本一起安裝。

Visual Studio 2010

  >>Visual Studio

    >>Visual Studio 語言

      >>Visual C++

        >>Building a C/C++ Program

          >>在 Visual Studio 中生成 C++ 項目

            >>用于生成指令和屬性的宏

<a href="http://www.cnblogs.com/owen-zhang/archive/2010/01/07/VisualStudioTemporaryFilesFolder.html" target="_blank">http://www.cnblogs.com/owen-zhang/archive/2010/01/07/VisualStudioTemporaryFilesFolder.html</a>

Visual Studio臨時檔案存放的檔案夾

在使用Visual Studio開發工具的過程中,Visual Studio會在如下檔案夾(以VS2008和.NET Framework 2.0為例)中生成一些臨時性的檔案:

1、ReflectedSchemas:完整路徑為“C:\Documents and Settings\Administrator\Application Data\Microsoft\VisualStudio\9.0\ReflectedSchemas”。

2、ReflectedTypeLibs:完整路徑為“C:\Documents and Settings\Administrator\Application Data\Microsoft\VisualStudio\9.0\ReflectedTypeLibs”。

3、Temporary ASP.NET Files:完整路徑為“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files“。

我的系統不是C槽,使用者名也不是Administrator,有批處理指令中用環境變量:

1、%USERPROFILE%\Application Data\Microsoft\VisualStudio\9.0\ReflectedSchemas

2、%USERPROFILE%\Application Data\Microsoft\VisualStudio\9.0\ReflectedTypeLibs

3、%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 

Windows系統路徑環境變量

%SystemDrive%        作業系統所在的分區号。如   C:

%SystemRoot%         作業系統根目錄。如 C:\WINDOWS

%windir%                   作業系統根目錄。如 C:\WINDOWS

%ALLUSERSPROFILE%           相當于   C:\Documents and Settings\All Users

%APPDATA%           相當于   C:\Documents and Settings\使用者目錄\Application Data

%ProgramFiles%      相當于   C:\Program Files

%CommonProgramFiles%          相當于   C:\Program Files\Common Files

%HOMEDRIVE%       作業系統所在的分區号。如:C:

%HOMEPATH%        相當于   \Documents and Settings\使用者目錄

%USERPROFILE%   相當于   C:\Documents and Settings\使用者目錄

%HOMEDRIVE%     = C:\                    目前啟動的系統的所在分區

%SystemRoot%      = C:\WINDOWS           目前啟動的系統的所在目錄

%windir%                 = %SystemRoot% = C:\WINDOWS                   目前啟動的系統的所在目錄

%USERPROFILE% = C:\Documents and Settings\sihochina           目前使用者資料變量

%HOMEPATH%       = C:\Documents and Settings\sihochina           目前使用者環境變量

%system%              = C:\WINDOWS\SYSTEM32   

%ALLUSERSPROFILE% : 列出所有使用者Profile檔案位置。

%APPDATA% :   列出應用程式資料的預設存放位置。

%CD% :   列出目前目錄。

%CLIENTNAME% :   列出聯接到終端服務會話時用戶端的NETBIOS名。

%CMDCMDLINE% :   列出啟動目前cmd.exe所使用的指令行。

%CMDEXTVERSION% :   指令出目前指令處理程式擴充版本号。

%CommonProgramFiles% :   列出了常用檔案的檔案夾路徑。

%COMPUTERNAME% :   列出了計算機名。

%COMSPEC% :   列出了可執行指令外殼(指令處理程式)的路徑。

%DATE% :   列出目前日期。

%ERRORLEVEL% :   列出了最近使用的指令的錯誤代碼。

%HOMEDRIVE% :   列出與使用者主目錄所在的驅動器盤符。

%HOMEPATH% :   列出使用者主目錄的完整路徑。

%HOMESHARE% :   列出使用者共享主目錄的網絡路徑。

%LOGONSEVER% :   列出有效的目前登入會話的域名控制器名。

%NUMBER_OF_PROCESSORS% :   列出了計算機安裝的處理器數。

%OS% :   列出作業系統的名字。(Windows XP 和 Windows 2000 列為 Windows_NT.)

%Path% :   列出了可執行檔案的搜尋路徑。

%PATHEXT% :   列出作業系統認為可被執行的檔案擴充名。

%PROCESSOR_ARCHITECTURE% :   列出了處理器的晶片架構。

%PROCESSOR_IDENTFIER% :   列出了處理器的描述。

%PROCESSOR_LEVEL% :   列出了計算機的處理器的型号。

%PROCESSOR_REVISION% :   列出了處理器的修訂号。

%ProgramFiles% :   列出了Program Files檔案夾的路徑。

%PROMPT% :   列出了目前指令解釋器的指令提示設定。

%RANDOM% :   列出界于0 和 32767之間的随機十進制數。

%SESSIONNAME% :   列出連接配接到終端服務會話時的連接配接和會話名。

%SYSTEMDRIVE% :   列出了Windows啟動目錄所在驅動器。

%SYSTEMROOT% :   列出了Windows啟動目錄的位置。

%TEMP% and %TMP% :   列出了目前登入的使用者可用應用程式的預設臨時目錄。

%TIME% :   列出目前時間。

%USERDOMAIN% :   列出了包含使用者帳号的域的名字。

%USERNAME% :   列出目前登入的使用者的名字。

%USERPROFILE% :   列出目前使用者Profile檔案位置。

%WINDIR% :   列出作業系統目錄的位置。

變量 類型 描述

%ALLUSERSPROFILE% 本地 傳回“所有使用者”配置檔案的位置。

%APPDATA% 本地 傳回預設情況下應用程式存儲資料的位置。

%CD% 本地 傳回目前目錄字元串。

%CMDCMDLINE% 本地 傳回用來啟動目前的 Cmd.exe 的準确指令行。

%CMDEXTVERSION% 系統 傳回目前的“指令處理程式擴充”的版本号。

%COMPUTERNAME%   系統 傳回計算機的名稱。

%COMSPEC%   系統 傳回指令行解釋器可執行程式的準确路徑。

%DATE%   系統 傳回目前日期。使用與 date /t 指令相同的格式。由 Cmd.exe 生成。有關 date 指令的詳細資訊,請參閱 Date。

%ERRORLEVEL%   系統 傳回上一條指令的錯誤代碼。通常用非零值表示錯誤。

%HOMEDRIVE%   系統 傳回連接配接到使用者主目錄的本地工作站驅動器号。基于主目錄值而設定。使用者主目錄是在“本地使用者群組”中指定的。

%HOMEPATH%   系統 傳回使用者主目錄的完整路徑。基于主目錄值而設定。使用者主目錄是在“本地使用者群組”中指定的。

%HOMESHARE%   系統 傳回使用者的共享主目錄的網絡路徑。基于主目錄值而設定。使用者主目錄是在“本地使用者群組”中指定的。

%LOGONSERVER%   本地 傳回驗證目前登入會話的域控制器的名稱。

%NUMBER_OF_PROCESSORS%   系統 指定安裝在計算機上的處理器的數目。

%OS%   系統 傳回作業系統名稱。Windows 2000 顯示其作業系統為 Windows_NT。

%PATH% 系統 指定可執行檔案的搜尋路徑。

%PATHEXT% 系統 傳回作業系統認為可執行的檔案擴充名的清單。

%PROCESSOR_ARCHITECTURE%   系統 傳回處理器的晶片體系結構。值:x86 或 IA64(基于 Itanium)。

%PROCESSOR_IDENTFIER% 系統 傳回處理器說明。

%PROCESSOR_LEVEL%   系統 傳回計算機上安裝的處理器的型号。

%PROCESSOR_REVISION% 系統 傳回處理器的版本号。

%PROMPT% 本地 傳回目前解釋程式的指令提示符設定。由 Cmd.exe 生成。

%RANDOM% 系統 傳回 0 到 32767 之間的任意十進制數字。由 Cmd.exe 生成。

%SYSTEMDRIVE% 系統 傳回包含 Windows server operating system 根目錄(即系統根目錄)的驅動器。

%SYSTEMROOT%   系統 傳回 Windows server operating system 根目錄的位置。

%TEMP% 和 %TMP% 系統和使用者 傳回對目前登入使用者可用的應用程式所使用的預設臨時目錄。有些應用程式需要 TEMP,而其他應用程式則需要 TMP。

%TIME% 系統 傳回目前時間。使用與 time /t 指令相同的格式。由 Cmd.exe 生成。有關 time 指令的詳細資訊,請參閱 Time。

%USERDOMAIN% 本地 傳回包含使用者帳戶的域的名稱。

%USERNAME% 本地 傳回目前登入的使用者的名稱。

%USERPROFILE% 本地 傳回目前使用者的配置檔案的位置。

%WINDIR% 系統 傳回作業系統目錄的位置。

%temp%        = %USERPROFILE%\Local Settings\Temp = C:\Documents and Settings\sihochina\Local Settings\Temp                                                                              目前使用者TEMP緩存變量

------------------------------------------------------------------------

例如:%windir%\drives 的實際路徑就是 C:\WINDOWS\drives 目錄。

          所謂變量,就是指一個在不同環境中會有相對不同的值的、但在所有環境中都有相同約定的含義的量。

          這些變量,可以在開始菜單-運作中輸入,如輸入%SystemRoot% ,系統會直接打開 C:\WINDOWS 目錄。

如果你目前的系統是裝在D盤的2000的話,上邊這個變量的執行結果就是打開 D:\WINNT 目錄了。

首先明确一點: 所有的在cmd指令行下對環境變量的修改隻對目前視窗有效,不是永久性的修改。也就是說當關閉此cmd指令行視窗後,将不再起作用。

永久性修改環境變量的方法有兩種:一種是直接修改系統資料庫(此種方法目前沒試驗過),另一種是通過我的電腦-〉屬性-進階,來設定系統的環境變量(檢視詳細)。

其次,明确一下環境變量的作用。

它是作業系統用來指定運作環境的一些參數。比如臨時檔案夾位置和系統檔案夾位置等。當你運作某些程式時,除了在目前檔案夾中尋找外,還會到這些環境變量中去查找,比如“Path”就是一個變量,裡面存儲了一些常用的指令所存放的目錄路徑。

第三:什麼情況下進行設定?

當啟動cmd指令行視窗調用某一指令的時候,經常會出現“xxx不是内部或外部指令,也不是可運作的程式或批處理檔案”,如果你的拼寫沒有錯誤,同時計算機中确實存在這個程式,那麼出現這個提示就是你的path變量沒有設定正确,因為你的path路徑,也就是預設路徑裡沒有你的程式,同時你有沒有給出你程式的絕對路徑(因為你隻是輸入了指令或程式的名稱而已),這是作業系統不知道去哪兒找你的程式,就會提示這個問題。

第四:如何修改?

1、檢視目前所有可用的環境變量:輸入 set 即可檢視。

2、檢視某個環境變量:輸入 “set 變量名”即可,比如想檢視path變量的值,即輸入 set path

3、修改環境變量 :輸入 “set 變量名=變量内容”即可,比如将path設定為“d:\nmake.exe”,隻要輸入set path="d:\nmake.exe"。注意,此修改環境變量是指用現在的内容去覆寫以前的内容,并不是追加。比如當我設定了上面的path路徑之後,如果我再重新輸入set path="c",再次檢視path路徑的時候,其值為“c:”,而不是“d:\nmake.exe”;“c”。

4、設定為空:如果想将某一變量設定為空,輸入“set 變量名= ”即可。如“set path=” 那麼檢視path的時候就為空。注意,上面已經說了,隻在目前指令行視窗起作用。是以檢視path的時候不要去右擊“我的電腦”——“屬性”........

5、給變量追加内容(不同于3,那個是覆寫):輸入“set 變量名=%變量名%;變量内容”。如,為path添加一個新的路徑,輸入“ set path=%path%;d:\nmake.exe”即可将d:\nmake.exe添加到path中,再次執行"set path=%path%;c:",那麼,使用set path語句來檢視的時候,将會有:d:\nmake.exe;c:,而不是像第3步中的隻有c:。

附錄:下面貼上一些常用的環境變量及作用

%ALLUSERSPROFILE% 局部 傳回所有“使用者配置檔案”的位置。

%APPDATA% 局部 傳回預設情況下應用程式存儲資料的位置。

%CD% 局部 傳回目前目錄字元串。

%CMDCMDLINE% 局部 傳回用來啟動目前的 Cmd.exe 的準确指令行。

%COMPUTERNAME% 系統 傳回計算機的名稱。

%COMSPEC% 系統 傳回指令行解釋器可執行程式的準确路徑。

%DATE% 系統 傳回目前日期。使用與 date /t 指令相同的格式。由 Cmd.exe 生成。有關 date 指令的詳細資訊,請參閱Date。

%ERRORLEVEL% 系統 傳回最近使用過的指令的錯誤代碼。通常用非零值表示錯誤。

%HOMEDRIVE% 系統 傳回連接配接到使用者主目錄的本地工作站驅動器号。基于主目錄值的設定。使用者主目錄是在“本地使用者群組”中指定的。

%HOMEPATH% 系統 傳回使用者主目錄的完整路徑。基于主目錄值的設定。使用者主目錄是在“本地使用者群組”中指定的。

我也一直不明白,以下兩篇文章就能說明問題.

--------------------------------------------------

标題: 怎樣用腳本來設定環境變量 

我想編一個腳本程式,用來對一組環境變量進行設定或取消

但由于腳本程式對變量的設定在退出腳本後就消失了,有沒有間接辦法能夠實作這個功能? 

你說的是 export ?

在腳本中使用export, 好像隻在腳本中有效,退出這個腳本,設定的變量就沒有了

在你的腳本中做設定

在~/.profile 或 ~/.bashrc 等 用source運作    

我試了一下,

用source可以運作普通的shell腳本,也可達到設定環境變量的目的,

想問一下source是什麼指令?用man和info沒有查到說明  

source 是 bash 的内嵌指令,

man bash

/source filename \[arguments\]

Thank u

source filename

or

代碼:

. filename

source好像不一定是bash的‘内嵌指令’

忘了是哪個發行版了

source是外部指令

$ type source

source is a shell builtin

哪個BT的發行版把 source 外部化了?忽忽。。

我自己也是一個菜鳥,接觸linux沒有多久,最近在學習BASH的export指令時碰到了一個難道(書

上說export是将自定義變量變成系統環境變量):我在一個腳本檔案中定義一個了變量,然後expor

t變量,按照我自己的想法,執行完這個腳本後,在提示符下一定可以用echo顯示出它的值,可結

果卻不是這樣,腳本執行完後用set根本看不到有這個變量存在。為什麼呢?我百思不得其解,最後

将問題貼出來,一位前輩告訴我說用source+腳本檔案就可以了,我試了一下果然可以,但一個新

的問題又出來了。我将腳本中export指令删除後,用source一樣可以。那這個export好像沒有什麼

用呀。 

在經過多次嘗試後發現了一些東西,是我自己猜的,如果有什麼不對的地方,請指正,謝謝。 

執行一個腳本時,會先開啟一個子 shell環境(不知道執行其它程式是不是這樣),然後将父shell

中的所有系統環境變量複制過來,這個腳本中的語句就在子shell中執行。(也就是說父shell的環境

變量在子shell中可以調用,但反過來就不行,如果在子shell中定義了環境變量,隻對該shell或者它

的子shell有效,當該子shell結束時,也可以了解為腳本執行完時,變量消失。)為了證明這一點,

請看腳本内容: 

test='value' 

export test 

這樣的腳本執行完後,test實際上是不存在的。接着看下面的: 

bash 

這裡在腳本最後一行再開一個子shell,該shell應該是腳本檔案所在shell的子shell,這個腳本執行完

後,是可以看到test這個變量的,因為現在是處于它的子shell中,當用exit退出子shell後,test變量

消失。 

如果用source對腳本進行執行時,&lt;b&gt;如果不加export,就不會在子shell中看到這個變量&lt;/b&gt;,因

為它還不是一個系統環境變量呀,如腳本内容是: 

用 source執行後,在shell下是能看到這個變量,但再執行bash開一個子shell時,test是不會被複

Page 1 of  怎樣用腳本來設定環境變量

行時,是不會輸入任何東西的,内容如: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 filena

me.明白了為什麼不一樣了吧?直接執行一個腳本檔案是在一個子shell中運作的,而source則是在

目前shell環境中運作的。根據前面的内容,你也已經明白其中的道理了吧。 

困擾了我幾天的問題終于可以圓滿的解決了。

不過還有一個問題,聽說子shell的環境變量與父shell的也不完全一樣,究竟差别是什麼?

source指令:

source指令也稱為“點指令”,也就是一個點符号(.)。source指令通常用于重新執行剛修改的初

始化檔案,使之立即生效,而不必登出并重新登入。

用法: 

source filename 或 . filename

source指令除了上述的用途之外,還有一個另外一個用途。在對編譯系統核心時常常需要輸入一長

串的指令,如:

make mrproper

make menuconfig

make dep

make clean

make bzImage

…………

如果把這些指令做成一個檔案,讓它自動順序執行,對于需要多次反複編譯系統核心的使用者來說會

很友善,而用source指令就可以做到這一點,它的作用就是把一個檔案的内容當成shell來執行,先

在linux的源代碼目錄下(如/usr/src/linux-2.4.20)建立一個檔案,如 make_command,在其中輸

入一下内容:

make mrproper &amp;&amp;

make menuconfig &amp;&amp;

make dep &amp;&amp;

make clean &amp;&amp;

make bzImage &amp;&amp;

make modules &amp;&amp;

make modules_install &amp;&amp;

cp arch/i386/boot/bzImage /boot/vmlinuz_new &amp;&amp;

cp System.map /boot &amp;&amp;

vi /etc/lilo.conf &amp;&amp;

lilo -v

檔案建立好之後,每次編譯核心的時候,隻需要在/usr/src/linux-2.4.20下輸入:

source make_command

即可,如果你用的不是lilo來引導系統,可以把最後兩行去掉,配置自己的引導程式來引導核心。

順便補充一點,&amp;&amp;指令表示順序執行由它連接配接的指令,但是隻有它之前的指令成功執行完成了之後

才可以繼續執行它後面的指令。

==============================================================

1、引言

Page 2 of  怎樣用腳本來設定環境變量

d not found”的提示内容。如果每次都到安裝目标檔案夾内,找到可執行檔案來進行操作就太繁瑣

了。這涉及到環境變量PATH的設定問題,而PATH的設定也是在linux下定制環境變量的一個組成

部分。本文基于RedHat 9.0,詳細講解了環境變量定制的問題。

2、變量簡介

Linux是一個多使用者的作業系統。每個使用者登入系統後,都會有一個專用的運作環境。通常每

個使用者預設的環境都是相同的,這個預設環境實際上就是一組環境變量的定義。使用者可以對自己的

運作環境進行定制,其方法就是修改相應的系統環境變量。

3、定制環境變量

    環境變量是和Shell緊密相關的,使用者登入系統後就啟動了一個Shell。對于Linux來說一般是

bash,但也可以重新設定或切換到其它的 Shell。根據發行版本的情況,bash有兩個基本的系統級

配置檔案:/etc/bashrc和/etc/profile。這些配置檔案包含兩組不同的變量:shell變量和環境變量。

前者隻是在特定的shell中固定(如bash),後者在不同shell中固定。很明顯,shell變量是局部的,

而環境變量是全局的。環境變量是通過Shell指令來設定的,設定好的環境變量又可以被所有目前用

戶所運作的程式所使用。對于bash這個Shell程式來說,可以通過變量名來通路相應的環境變量,

通過export來設定環境變量。下面通過幾個執行個體來說明。

3.1 使用指令echo顯示環境變量

#本例使用echo顯示常見的變量HOME

$ echo $HOME   

/home/lqm

3.2 設定一個新的環境變量 

$ export HELLO=”Hello!”

$ echo $HELLO

Hello!

3.3 使用env指令顯示所有的環境變量

$ env

SSH_AGENT_PID=1875

HOSTNAME=lqm

SHELL=/bin/bash

TERM=xterm

HISTSIZE=1000

……

3.4  使用set指令顯示所有本地定義的Shell變量

$ set

BASH=/bin/bash

3.5  使用unset指令來清除環境變量

$ export TEST=”test”      #增加一個環境變量TEST

$ env | grep TEST           #此指令有輸出,證明環境變量TEST已經存在了

TEST=test

$ unset $TEST                #删除環境變量TEST

$ env | grep TEST           #此指令無輸出,證明環境變量TEST已經存在了

3.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

3.7  用C程式來通路和設定環境變量

對于C程式的使用者來說,可以使用下列三個函數來設定或通路一個環境變量。

getenv()  通路一個環境變量。輸入參數是需要通路的變量名字,傳回值是一個字元串。如果所

通路的環境變量不存在,則會傳回NULL。

setenv()  在程式裡面設定某個環境變量的函數。

unsetenv()  清除某個特定的環境變量的函數。

另外,還有一個指針變量environ,它指向的是包含所有的環境變量的一個清單。下面的程式可

以列印出目前運作環境裡面的所有環境變量:

#include &lt;stdio.h&gt;

extern char**environ;

int main ()

{

char**var;

for (var =environ;*var !=NULL;++var)

printf ("%s \n ",*var);

return 0;

}

3.8      通過修改環境變量定義檔案來修改環境變量。

需要注意的是,一般情況下,這僅僅對于普通使用者适用,避免修改根使用者的環境定義檔案,因

為那樣可能會造成潛在的危險。

$cd                                     #到使用者根目錄下

$ls -a                                  #檢視所有檔案,包含隐藏的檔案

$vi .bash_profile                 #修改環境變量定義檔案

然後編輯你的PATH聲明,其格式為:

PATH=$PATH:&lt;PATH 1&gt;:&lt;PATH 2&gt;:&lt;PATH 3&gt;:------:&lt;PATH N&gt;

你可以自己加上指定的路徑,中間用冒号隔開。環境變量更改後,在使用者下次登陸時生效,如

果想立刻生效,則可執行下面的語句:$source .bash_profile

需要注意的是,最好不要把目前路徑”./”放到PATH裡,這樣可能會受到意想不到的攻擊。完

成後,可以通過$ echo $PATH檢視目前的搜尋路徑。這樣定制後,就可以避免頻繁的啟動位于shel

l搜尋的路徑之外的程式了。

4  總結

    通過以上的設定,你可以有一個比較友善有效的環境來提高你的

<a href="http://www.360doc.com/content/12/0211/14/6828497_185770493.shtml">http://www.360doc.com/content/12/0211/14/6828497_185770493.shtml</a>

UNIX Programming FAQ 中文版 v0.1.0

<a href="http://www.linuxforum.net/books/upfaq/c46.htm">Prev</a>

Chapter 1. 程序控制

<a href="http://www.linuxforum.net/books/upfaq/x152.htm">Next</a>

獲得一個環境變量可以通過調用‘getenv()’函數完成。

設定一個環境變量可以通過調用‘putenv()’函數完成。

變量string應該遵守"name=value"的格式。已經傳遞給putenv函數的字元串*不*能夠被釋放或變成無效,因為一個指向它的指針将由‘putenv()’儲存。這意味着它必須是在靜态資料區中或是從堆(heap)配置設定的。如果這個環境變量被另一個‘putenv()’的調用重新定義或删除,上述字元串可以被釋放。

/**************************譯者增加***********************************

因為putenv()有這樣的局限,在使用中經常會導緻一些錯誤,GNU libc 中還包括了兩個BSD風格的函數:

setenv()/unsetenv()函數可以完成所有putenv()能做的事。setenv() 可以不受指針限制地向環境變量中添加新值,但傳入參數不能為空(NULL)。當replace為0時,如果環境變量中已經有了name項,函數什麼也不做(保留原項),否則原項被覆寫。 unsetenv()是用來把name項從環境變量中删除。注意:這兩個函數隻存在在BSD和GNU 庫中,其他如SunOS系統中不包括它們,是以将會帶來一些相容問題。我們可以用 getenv()/putenv()來實作:

**************************譯者增加***********************************/

記住環境變量是被繼承的;每一個程序有一個不同的環境變量表拷貝(譯者注:從core檔案中我們可以看出這一點)。結果是,你不能從一個其他程序改變目前程序的環境變量,比如shell程序。

假設你想得到環境變量‘TERM’的值,你需要使用下面的程式:

現在假設你想建立一個新的環境變量,變量名為‘MYVAR’,值為‘MYVAL’。以下是你将怎樣做:

如果你不知道确切你想要的環境變量的名字,那麼‘getenv()’函數不是很有用。在這種情況下,你必須更深入了解環境變量表的存儲方式。

全局變量,‘char **envrion’,包含指向環境字元串指針數組的指針,每一個字元串的形式為‘“NAME=value”’(譯者注:和putenv()中的“string”的格式相同)。這個數組以一個‘空’(NULL)指針标記結束。這裡是一個列印目前環境變量清單的小程式(類似‘printenv’)。

一般情況下,‘envrion’變量作為可選的第三個參數傳遞給‘main()’;就是說,上面的程式可以寫成:

雖然這種方法被廣泛的操縱系統所支援(譯者注:包括DOS),這種方法事實上并沒有被POSIX(譯者注:POSIX: Portable Operating System Interace)标準所定義。(一般的,它也比較沒用)

<a href="http://www.linuxforum.net/books/upfaq/x124.htm">http://www.linuxforum.net/books/upfaq/x124.htm</a>

ANSI C标準提供了一個名為getenv()的函數來完成這項任務。getenv()函數很簡單一把指向要查找的環境串的指針傳遞給它,它就傳回一個指向該變量值的指針。下面的程式說明了如何從C中獲得環境變量PATH的值:

# include &lt;stdlib. h&gt;

main(int argc, char *  *  argv)

    char envValue[l29];             / *  buffer to store PATH * /

    char *  envPtr = envValue ;     / *  pointer to this buffer  * /

    envPtr = getenv("PATH");        /*  get the PATH */

    printf ("PATH= %s\n" , envPtr) ;   / * print the PATH * /

如果你編譯并運作了這個程式,你就會看到與在DOS提示符下輸入PATH指令完全相同的結果。事實上,你可以用getenv()檢索AUTOEXEC.BAT檔案中的或者系統引導後在DOS揭示符下輸入的所有環境變量的值。

這裡有一個小技巧。當運作Windows時,Windows設定了一個名為WINDIR的新的環境變量,它包含了Windows目錄的路徑全名。下面這段簡單的程式用來檢索這個串:

main(int argc, char * *  argv)

    char envValue[l29];

    char *  envPtr = envValue ;

   envPtr = getenv("windir");

    / * print the Windows directory * /

    printf("The Windows Directory is  %s\n" ,  envPtr);

這個程式還可以用來判斷目前是否正在運作Windows,以及DOS程式是否運作在一個DOS shell下,而不是運作在“真正的"DOS下。注意,程式中的windir字元串是小寫——這一點很重要,因為它對大小寫是敏感的。如果你使用WINDIR,getenv()就會傳回一個NULL串(表示變量未找到錯誤)。

用一putenv()函數也可以設定環境變量。但要注意,該函數不是一個ANSI标準函數,在某些編譯程式中它可能不以這個名字出現,或者根本就不存在。你可以用一putenv()函數做許多事情。實際上,在上面那個例子中,Windows正是用這個函數建立了windir環境變量。

<a href="http://see.xidian.edu.cn/cpp/html/1641.html">http://see.xidian.edu.cn/cpp/html/1641.html</a>

In VS 2008 and VS 2005 at least, you can specify changes to environment variables in the project settings.

Open your project. Go to Project&gt;Properties... Under Configuration Properties&gt;Debugging, edit the 'Environment' value to set environment variables.

For example, if you want to add the directory "c:\foo\bin" to the path when debugging your app, set the 'Environment' value to"PATH=%PATH%;c:\foo\bin".

Here's a screenshot of the setting s dialog:

Visual Studio 2008 、 Windows 環境變量介紹 和 如何在檔案中引用環境變量 .

<a href="http://www.404qa.com/q-182.html">http://www.404qa.com/q-182.html</a>

 參考網址: