unix 将地址写入环境变量

2017-10-01 14:40:10 u013514928 阅读数 16587

 一、Java获取环境变量

Java 获取环境变量的方式很简单: 

System.getEnv()  得到所有的环境变量

System.getEnv(key) 得到某个环境变量

Map map = System.getenv();  
Iterator it = map.entrySet().iterator();  
while(it.hasNext())  
{  
    Entry entry = (Entry)it.next();  
    System.out.print(entry.getKey()+"=");  
    System.out.println(entry.getValue());  
}  

二、获取系统变量

Java 获取环境变量的方式也很简单:

System.getProperties()  得到所有的系统变量

System.getProperty(key)  得到某个系统变量的值

Properties properties = System.getProperties();  
Iterator it =  properties.entrySet().iterator();  
while(it.hasNext())  
{  
    Entry entry = (Entry)it.next();  
    System.out.print(entry.getKey()+"=");  
    System.out.println(entry.getValue());  
}  
三、设置系统变量

可以通过System.setProperty(key, value)  的方式设置自己需要的系统变量。

public class SystemEnvironment {

	public static void main(String[] args) {
		Properties properties = System.getProperties();
		Iterator it = properties.entrySet().iterator();
		while (it.hasNext()) {
			Entry entry = (Entry) it.next();
			System.out.print(entry.getKey() + "=");
			System.out.println(entry.getValue());

		}
		// java类路径
		String javaClassPath = System.getProperty("java.class.path");
		System.out.println(javaClassPath);

	    System.setProperty("java.class.path", javaClassPath + ";D:\\");
		
		javaClassPath = System.getProperty("java.class.path");
		System.out.println(javaClassPath);
	}

}


默认情况下, java 设置了哪些系统变量:

java.version Java 运行时环境版本 
java.vendor Java 运行时环境供应商 
java.vendor.url Java 供应商的 URL 
java.home Java 安装目录 
java.vm.specification.version Java 虚拟机规范版本 
java.vm.specification.vendor Java 虚拟机规范供应商 
java.vm.specification.name Java 虚拟机规范名称 
java.vm.version Java 虚拟机实现版本 
java.vm.vendor Java 虚拟机实现供应商 
java.vm.name Java 虚拟机实现名称 
java.specification.version Java 运行时环境规范版本 
java.specification.vendor Java 运行时环境规范供应商 
java.specification.name Java 运行时环境规范名称 
java.class.version Java 类格式版本号 
java.class.path Java 类路径 
java.library.path 加载库时搜索的路径列表 
java.io.tmpdir 默认的临时文件路径 
java.compiler 要使用的 JIT 编译器的名称 
java.ext.dirs 一个或多个扩展目录的路径 
os.name 操作系统的名称 
os.arch 操作系统的架构 
os.version 操作系统的版本 
file.separator 文件分隔符(在 UNIX 系统中是"/") 
path.separator 路径分隔符(在 UNIX 系统中是":") 
line.separator 行分隔符(在 UNIX 系统中是"/n") 
user.name 用户的账户名称 
user.home 用户的主目录 
user.dir 用户的当前工作目录


2012-02-14 15:14:43 wl_fln 阅读数 180533
 

由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命令详解 - huanghl97 - huanghl97
 
2、想要使得开机时自动加载这个环境变量免除以后每次设置,可将其写入/etc/re.local
linux export命令详解 - huanghl97 - huanghl97
 

 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文件:
#vi /etc/profile
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"

3. 修改.bashrc文件:
# vi /root/.bashrc
在里面加入:
export PATH="$PATH:/opt/au1200_rm/build_tools/bin"

后两种方法一般需要重新注销系统才能生效,最后可以通过echo命令测试一下:
# echo $PATH
看看输出里面是不是已经有了 /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”等路径已经在系统环境变量中了,如果可执行文件在这几个标准位置,在终端命令行输入该软件可执行文件的文件名和参数(如果需要参数),回车即可。

  如果不在标准位置,文件名前面需要加上完整的路径。不过每次都这样跑就太麻烦了,一个“一劳永逸”的办法是把这个路径加入环境变量。命令 export $PATH="路径”(或“PATH=$PATH:路径”) ($PATH为环境变量名,如DVSDK;调用时用$DVSDK)可以把这个路径加入环境变量,但是退出这个命令行就失效了。要想永久生效,需要把这行添加到环境变量文件里。有两个文件可选:“/etc/profile”和用户主目录下的“.bash_profile”,“/etc/profile”对系统里所有用户都有效,用户主目录下的“.bash_profile”只对这个用户有效

  export $PATH="$PATH:路径1:路径2:...:路径n” (或“PATH=$PATH:路径1:路径2:...:路径n" 意思是可执行文件的路径包括原先设定的路径,也包括从“路径1”到“路径n”的所有路径。当用户输入一个一串字符并按回车后,shell会依次在这些路径里找对应的可执行文件并交给系统核心执行。那个“$PATH”表示原先设定的路径仍然有效,注意不要漏掉。某些软件可能还有“PATH”以外类型的环境变量需要添加,但方法与此相同,并且也需要注意“$”。

  注意,与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环境中运行的。

2017-03-15 11:29:16 qq_29350001 阅读数 4557

之前讲gcc编译的时候,参看:C语言再学习 -- GCC编译过程 提到过静态库和共享库,那时只是简单的讲了下它们相关的编译链接,接下来就该详细介绍它们了。不过再讲解之前还需了解一下编程相关的环境变量。

一、环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量时在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用的信息。

1、Windows下的环境变量

(1)环境变量配置
右击我的电脑->属性->高级系统设置->高级->环境变量->系统变量->选中Path 点击编辑->在Path变量值的最后增加分号(;),再增加新的路径。
注意:(千万不要改动之前的变量值)->一路点击确定即可

(2)常见环境变量:(了解)
%ALLUSERSPROFILE% 局部 返回所有“用户配置文件”的位置。
%APPDATA% 局部 返回默认情况应用程序存储数据的位置。
%CD% 局部 返回当前目录字符串。
%CMDCMDLINE% 局部 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 date 命令的详细信息,请参阅 Date。
%ERRORLEVEL% 系统 返回使用过的命令错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值的设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSEVER% 局部 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统的名称。Windows 2000 将操作系统显示为 Windows_NT。
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值: x86,IA64。
%PROCESSOR_IDENTIFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器修订号的系统变量
%PROMPT% 局部 返回当前解释程序命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系统 返回包含 Windows XP 根目录(即系统根目录)的驱动器
%SYSTEMROOT% 系统 返回 Windows XP 根目录的位置。
%TEMP% and %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其它应用程序则需要 TMP。
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 time 命令的详细信息,请参阅 Time。
%USERDOMAIN% 局部 返回包含用户帐户的域的名称。
%USERNAME% 局部 返回当前登录的用户的名称。
%UserProfile% 局部 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。

2、Linux下的环境变量(重点)

linux是一个多用户的操作系统,每个用户登录系统之后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的。这个默认的环境实际上就是一组环境变量的定义,用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。
在linux中,环境变量一般用大写加下划线命名(例如,PATH、ORACLE_HOME)。环境变量就相当于一个指针,当我们要查看指针所指向的值的时候需要解引用。同样的,当我们想要查看环境变量里面的值的时候,需要在前面加 $ 引用。
linux的变量分为环境变量和本地变量:
环境变量:是一种全局变量,存在所有的shell中,在登录的时候就有系统定义的环境变量了。linux的环境变量具有继承性,即shell会继承父shell的环境变量
本地变量:当前shell中的变量,本地变量中包含环境变量。Linux的本地变量的非环境变量不具备继承性。
在Linux下面的变量按照生存周期可分为两类:
永久的:需要修改配置文件,变量永久生效。
临时的:使用export命令声明即可,变量在关闭shell时失效。
修改和查看环境变量的指令
(1)echo:查看单个环境变量
例如,显示环境变量HOME
# echo $HOME
/root
(2)env:查看所有环境变量
例如,查看所有的环境变量,可以看一下都有哪些环境变量。
# env
LC_PAPER=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
SSH_AGENT_PID=1768
LC_MONETARY=en_US.UTF-8
GPG_AGENT_INFO=/tmp/keyring-rB9csr/gpg:0:1
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=619793d1806621208703bfca00000005-1489544306.787815-2133755939
WINDOWID=31457285
LC_NUMERIC=en_US.UTF-8
GNOME_KEYRING_CONTROL=/tmp/keyring-rB9csr
USER=root
.....
可以和grep一起使用查看某一类的环境变量
# env | grep SH
SSH_AGENT_PID=1768
SHELL=/bin/bash
SSH_AUTH_SOCK=/tmp/keyring-rB9csr/ssh
SHLVL=1
(3)set:查看本地定义的环境变量
root@ubuntu:~# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="24" [3]="1" [4]="release" [5]="i686-pc-linux-gnu")
BASH_VERSION='4.2.24(1)-release'
.....
(4)export:设置一个新的环境变量 (临时的,重启后消失)
注意,一般环境变量都用大写加下划线来命名
例如,新建环境变量HELLO
# export HELLO="hello"
# echo $HELLO
hello
(5)unset:清除环境变量
例如,清除环境变量HELLO,清除后再查看为空
# unset HELLO
# echo $HELLO

#
(6)readonly:设置只读环境变量
例如,将环境变量HELLO设为只读,再修改或者清除该环境变量时会提示为只读变量,不能再对它进行操作。但是因为它是一个临时性的环境变量,所以用户退出登录以后就会自动失效。
# export HELLO="hello"
# readonly HELLO="hello"
# export HELLO="hello" world
bash: HELLO: 只读变量
# unset HELLO
bash: unset: HELLO: 无法反设定: 只读 variable
Linux系统常用的环境变量
(1)PATH:决定了shell将到哪些目录中寻找命令或程序
# echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/tarena/workdir/toolchains/opt/S5PV210-crosstools/4.4.6/bin
我们可以看到在当前目录下,默认的PATH的值。它表示当我们在当前目录下执行一条命令时命令的搜索路径。每一个目录都是以冒号隔开。例如:export PATH=$PATH:/opt/arm-2009q1-203/bin:
当我们执行一个可执行的程序时,系统就会到这些目录下面去找,在这些目录下找到的话才执行,否则不执行。
(2)HOME:指定用户的主目录(即用户登录到Linux系统时的默认目录)
环境变量是一个变量,会随着用户的不同,它的值也就不同。
普通用户下的主目录:
# echo $HOME
/home/admin
root超级用户下的主目录:
# echo $HOME
/root
(3)HISTSIZE:保存历史命令记录的条数
在linux中可以查找以前输入的命令,HISTSIZE这个环境的值就表示最多保存的记录的数目。
# echo $HISTSIZE
1000
可以看到,上面显示能够保存1000条。
(4)LOGNAME:显示当前用户的登录名   (同 指令logname)
echo $LOGNAME
root
(5)HOSTNAME:显示主机的名字 (同 指令hostname)
echo $HOSTNAME
ubuntu
(6)SHELL:指当前用户使用的shell类型
echo $SHELL
/bin/bash
(7)LANG/LANGUGE:语言相关的环境变量,多语言可以修改此环境变量
echo $LANG
zh_CN.UTF-8
(8)MAIL:当前用户的邮件存放的目录 (无邮件)
# echo $MAIL
(9)PS1:命令基本提示符,对root是 #,对普通用户是 $
# echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
(10)PS2:附属提示符,默认是 >
# echo $PS2
>
存放环境变量的文件
(1)/etc/profile (所有用户)
这个文件是每个用户登录时都会运行的环境变量设置,当用户第一次登陆时该文件被执行,并从/etc/profile.d目录的配置文件中搜索shell的设置。这个文件的作用就是当用户登录的时候用于获取系统的环境变量,只在登录的时候获取一次。
所以说,在/etc/profile文件中添加的变量,对所有用户永久的生效
之前用到过,参看:Hi3516A开发--安装交叉编译器
gedit /etc/profile
添加 export PATH="/opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin:$PATH"
执行 source /etc/profile
需要注意的是,修改完文件后想要马上生效还要运行 source /etc/profile 不然只能在下次重进此用户时生效。
再如:
#gcc找到头文件的路径
$C_INCLUDE_PATH=/opt/example/include  
$export C_INCLUDE_PATH  

#g++找到头文件的路径  
$CPLUS_INCLUDE_PATH=/opt/example/include  
$export CPLUS_INCLUDE_PATH  

#找到静态库的路径  
$LIBRARY_PATH=/opt/example/lib  
$export LIBRARY_PATH 

#找到动态链接库的路径
LD_LIBRARY_PATH=/opt/example/lib  
export LD_LIBRARY_PATH 
(2)~/.bash_profile (单个用户)
每个用户都可以使用该文件输入自己专用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,它设置一些环境变量,执行用户的.bashrc文件。单个用户对此文件的修改只会影响到它以后的每一次登录。
也就是说,在用户目录下的.bash_profile文件中增加变量,仅对当前用户永久生效,操作同 /etc/profile
(3)/etc/bashrc (所有用户)
在执行完 /etc/profile 内容后,如果用户运行 bash shell 的话,则就执行这个文件,当每次一个新的bash shell 被打开时,该文件被读取所以,如果每打开一个bash都执行某些操作,就可以在这个文件里面设置。
(4)~/.bashrc  (单个用户)
该文件只包含专用于你的bash信息,当你登录时以及每次打开新的shell时,该文件就会自动被读取
gedit .bashrc
添加 export PATH=$PATH:/opt/arm-2009q1-203/bin:
执行 source .bashrc
(5)~/.bash_logout
每次在退出shell的时候会执行该文件,它提供了定制用户环境的功能,比如删除账号内的临时文件等命令就可以放在bash_logout 文件内,如果这个文件不存在的话则就执行其他的命令。

3、编程相关的环境变量

(1)CPATH/C_INCLUDE_PATH 
C头文件的附加搜索路径,相当于gcc的 -I 选项
(2)CPLUS_INCLUDE_PATH
C++头文件的附加搜索路径
(3)LIBRARY_PATH
链接时查找静态库和共享库的路径,相当于 -I 选项
(4)LD_LIBRARY_PATH
运行时查找共享库的路径

关于Linux gcc中的 LIBRARY_PATH 和 LD_LIBRARY_PATH 参数说明
下面摘取了两篇较权威的说明资料:
1、 GNU 上关于LIBRARY_PATH的说明:
LIBRARY_PATH
The value of LIBRARY_PATH is a colon-separated list of directories, much like PATH.
When configured as a native compiler, GCC tries the directories thus specified when searching for special linker files, if it can't find them using GCC_EXEC_PREFIX.
Linking using GCC also uses these directories when searching for ordinary libraries for the -l option (but directories specified with -L come first). 
2、 man7 上关于LD_LIBRARY_PATH的说明:
LD_LIBRARY_PATH
A colon-separated list of directories in which to search for
ELF libraries at execution-time.  Similar to the PATH
environment variable.  Ignored in set-user-ID and set-group-ID
programs.
后面发现 StackOverflow 上关于 LIBRARY_PATH 和 LD_LIBRARY_PATH 的解释更直白:
LIBRARY_PATH is used by gcc before compilation to search for directories containing libraries that need to be linked to your program.

LD_LIBRARY_PATH is used by your program to search for directories containing the libraries after it has been successfully compiled and linked.

EDIT: As pointed below, your libraries can be static or shared.
If it is static then the code is copied over into your program and you don't need to search for the library after your program is compiled and linked.
If your library is shared then it needs to be dynamically linked to your program and that's when LD_LIBRARY_PATH comes into play.

Linux gcc编译链接时的共享库搜索路径
GCC编译、链接生成可执行文件时
,共享库的搜索路径顺序如下(注意不会递归性地在其子目录下搜索):
1、gcc编译、链接命令中的-L选项;
2、gcc的环境变量的LIBRARY_PATH(多个路径用冒号分割);
3、gcc默认共享库目录:/lib:/usr/lib:usr/lib64:/usr/local/lib。

执行二进制文件时的共享库搜索路径
链接生成二进制可执行文件后,在运行程序加载共享库文件时,搜索的路径顺序如下:
1、编译目标代码时指定的共享库搜索路径:用选项 -Wl,rpath 和 include 指定的共享库的搜索路径,比如 gcc -Wl,-rpath,include -L. -ldltest hello.c,在执行文件时会搜索路径 `./include`;
2、环境变量LD_LIBRARY_PATH(多个路径用冒号分割);
3、在 /etc/ld.so.conf.d/ 目录下的配置文件指定的共享库绝对路径(通过ldconfig生效,一般是非root用户时使用);
4、gcc默认共享库目录:/lib:/usr/lib:usr/lib64:/usr/local/lib等。

其中,Linux GCC默认的共享库搜索路径可以通过 ld --verbose 命令查看:
SEARCH_DIR("/usr/i686-linux-gnu/lib32"); SEARCH_DIR("=/usr/local/lib32"); SEARCH_DIR("=/lib32"); SEARCH_DIR("=/usr/lib32"); SEARCH_DIR("=/usr/local/lib/i386-linux-gnu"); SEARCH_DIR("=/usr/local/lib"); SEARCH_DIR("=/lib/i386-linux-gnu"); SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib/i386-linux-gnu"); SEARCH_DIR("=/usr/lib");
总结下来就是,共享库编译的时候与静态库一样依赖 LIBRARAY_PATH,运行的旪候依赖 LD_LIBRARY_PATH 。
这也就是我们为什么讲了这么长时间的环境变量。

4、环境列表

环境列表就是指环境变量的集合,而每个进程都拥有一张独立的环境列表,来保存和当前进程相关的环境变量信息。
环境列表,采用字符指针数组来存储所有的环境变量。
例如:
PATH                         0X01  //运行程序所有路径
CPATH            0X02  //C语言路径
LIBRARY_PATH    0X03  //静态库
LD_LIBRARY_PATH   0X04  //共享库
char* arr[5] = {0x01, 0x02, 0x03, 0x04};
环境列表采用字符指针数组来存储所有的环境变量,使用全局变量char** environ来记录环境表的首地址使用NULL 来代表环境表的结束所以访问环境表则需要借助environ变量。
//示例一
#include <stdio.h>

int main(void)
{
	//声明全局变量
	extern char** environ;
	//给环境表首地址指定替身
	char** p = environ;
	while(*p != NULL)
	{
		printf("%s\n",*p);
		//指向下一个
		p++;
	}
	return 0;
}

功能等同指令env,可自行尝试
//示例二
#include <stdio.h>
#include <string.h>

int main(void)
{
	//声明全局变量
	extern char** environ;
	//给环境表首地址指定替身
	char** p = environ;
	//练习:查找名字为SHELL的环境变量,获取SHELL的值存到buf的字符数组中,然后进行打印
	char buf[20] = {0};
	p = environ;
	while(*p != NULL)
	{
		//比较前6个字符是否相等
		if(!strncmp(*p,"SHELL=",6))
		{
			//跳过环境变量名=
			strcpy(buf,*p+6);
			break;
		}
		//比较下一个
		p++;
	}
	printf("SHELL=%s\n",buf);
	return 0;
}
输出结果:
SHELL=/bin/bash

功能等同指令echo $SHELL,可自行尝试

5、环境变量函数

(1)getenv函数
#include <stdlib.h>
char *getenv (const char *name);
函数功能:
表示根据参数指定的环境变量名去环境表进行查找
返回该环境变量所对应的环境值,查找失败则返回NULL.
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	char *pc = getenv ("SHELL");
	if (NULL == pc)
		perror ("getenv"), exit (-1);
	printf ("SHELL = %s\n", pc);
	return 0;
}
输出结果:
SHELL = /bin/bash

使用echo指令
# echo $SHELL
/bin/bash
(2)setenv函数
#include <stdlib.h>
int setenv (const char *name, const char *value, int overwrite);
第一个参数:环境变量名
第二个参数:环境变量值
第三个参数:是否修改
函数功能:
改变或增加环境变量,如果参数指定的环境变量不存在则增加。如果存在并且 overwrite 是非0,则修改环境名变量值,否则环境变量不变
成功返回 0,失败返回 -1
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	char *pc = getenv ("SHELL");
	if (NULL == pc)
		perror ("getenv"), exit (-1);
	printf ("SHELL = %s\n", pc);

	setenv ("SHELL", "ABC", 1);
	printf ("修改后的SHELL = %s\n", getenv ("SHELL"));
	return 0;
}
输出结果:
SHELL = /bin/bash
修改后的SHELL = ABC
(3)putenv函数
#include <stdlib.h>
int putenv (char *string);
函数功能:
表示按照参数的内容增加/修改环境变量,其中string的格式为:name=value,如果不存在则添加,存在则删除
成功返回0,失败返回-1
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	char *pc = getenv ("SHELL");
	if (NULL == pc)
		perror ("getenv"), exit (-1);
	printf ("SHELL = %s\n", pc);

		
	int res = putenv ("SHELL=abc");
	if (res)
		perror("putenv"),exit(-1);
	printf ("修改后的SHELL = %s\n", getenv ("SHELL"));

	putenv("CSDN=666");
	printf("增加的环境值是:%s\n",getenv("CSDN"));//123
	return 0;
}
输出结果:
SHELL = /bin/bash
修改后的SHELL = abc
增加的环境值是:666
(4)unsetenv函数
#include <stdlib.h>
int unsetenv (const char *name);
函数功能:
表示根据参数指定的环境变量去环境表中进行删除
成功返回0,失败返回-1
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	putenv("CSDN=666");
	printf("增加的环境值是:%s\n",getenv("CSDN"));//123

	unsetenv("CSDN");
	printf("删除的结果是:%s\n",getenv("CSDN"));
	return 0;
}
输出结果:
增加的环境值是:666
删除的结果是:(null)
(5)clearenv函数
#include <stdlib.h>
int clearenv (void);
函数功能:
表示清空整个环境表
成功返回0,失败返回-1

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
	int res;
	putenv("CSDN=666");
	printf("增加的环境值是:%s\n",getenv("CSDN"));//123

	res = clearenv ();
	if(res)
		perror("clearenv"), exit(-1);
	printf("清空整个环境表结束\n");
	printf("CSDN = %s\n",getenv("CSDN"));
	return 0;
}
输出结果:
增加的环境值是:666
清空整个环境表结束
CSDN = (null)

6、主函数的原型

我们之前将函数的时候提到过,参看:C语言再学习 -- 函数

main函数原型:

int main (int argc, char * argv[], char * envp[]) {....}

第一个参数:命令行参数的个数

第二个参数:命令行参数的地址信息

第三个参数:环境表的首地址

参数argc表示输入参数的个数(含命令名),如果有命令行参数,argc应不小于1;argv表示传入的参数的字符串,是一个字符串数组,argv[0]表示命令名,argv[1]指向第一个命令行参数;至于第三个参数env,它与全局变量environ相比也没有带来更多益处,所以POSIX.1也规定应使用environ而不使用第三个参数。通常用getenv和putenv函数来存取特定的环境变量,而不是直接使用environ变量。例如:

//main函数原型的使用  
#include <stdio.h>  
int main(int argc,char* argv[],char* envp[])  
{  
    printf("argc=%d\n",argc);  
    int i=0;  
    for(i=0;i<argc;i++)  
    {  
        printf("感谢%s\n",argv[i]);  
    }  
    //声明全局变量  
    extern char** environ;  
    printf("environ=%p,envp=%p\n",environ,envp);//直接访问环境表  
    return 0;  
}  
输出结果为:  
argc=1  
感谢./a.out  
environ=0xbfab74cc,envp=0xbfab74cc  


2011-12-05 19:04:48 ysdaniel 阅读数 9511

PATH=$PATH:/

:/后面加路径。


PATH是环境变量,要大写那几个目录是你放置linux命令的目录,输入命令后系统会去PATH中寻找是否存在该命令。

查看当前环境变量:echo $PATH也可以用set命令看一下设置:export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

登出后就失效,要一直有效,修改~/.bashrc或~/.bash_profile或

系统级别的/etc/profile

 就好像windows下的环境变量一样;

unix是把可执行文件放在PATH中,库文件放在同级的lib下,方便输命令。


以bash为例:

1)打开配置文件 ~/.bash_profile 

 2)找到PATH变量

 3)如将 ~/bin 目录添加到PATH中 则可以编辑文件 将PATH的值改成 PATH = $PATH;~/bin; 

4)保存退出 

5)使用source命令刷新加载的.bash_profile (source ~/.bash_profile) 如果是为所有用户添加的变量还可以编辑 /etc/profile 文件 方式同上


1. 全局的对所有用户都可以的使用的PATH: 可以通过修改配置文件: /etc/bashrc 和 /etc/profile 来时配置,全局的PATH; 例如: vi /etc/profile 在最后后加一行:PATH=THE_SET_GLOBLE_ENV_PATH:$PATH;接着换行: export PATH如果使其立即生效: source /etc/profile

2. 对于普通用户也可以设置,自己的路径:在自己的home目录中:ls -a | grep bash会找到两个文件: .bashrc 和 .bash_profile 同样可以像修改 /etc/profile一样,修改 .bash_profile 来配置你的个性PATH 环境。同样修改后,若不重启,就使其立即生效的话,不要忘了 source .bash_profile.呵呵,最看看的你的修改后的PATH: echo $PATH 或者 env 再者 set !!


于bash_profile和.bashrc的区别,请参考:

http://hi.baidu.com/ysdaniel/blog/item/40b0a71fbcd183058718bf27.html

2017-09-05 14:16:18 u012562943 阅读数 1004
环境变量这个概念不陌生,就是操作系统的环境变量。
系统变量就是Java本身维护的变量。 通过 System.getProperty 的方式获取。
对于不同的操作系统来说, 环境变量的处理可能会有一些不统一的地方, 比如说: 不区分大小写 等等。
Java 获取环境变量
Java 获取环境变量的方式很简单: 
System.getEnv()  得到所有的环境变量
System.getEnv(key) 得到某个环境变量的值
Map map = System.getenv();  
Iterator it = map.entrySet().iterator();  
while(it.hasNext())  
{  
    Entry entry = (Entry)it.next();  
    System.out.print(entry.getKey()+"=");  
    System.out.println(entry.getValue());  
}  

如果是windows 系统, 打印出来的值通过从 “我的电脑” 里看到的环境变量是一样的。
Java 获取和设置系统变量
Java 获取环境变量的方式也很简单:
System.getProperties()  得到所有的系统变量
System.getProperty(key)  得到某个系统变量的值
Properties properties = System.getProperties();  
Iterator it =  properties.entrySet().iterator();  
while(it.hasNext())  
{  
    Entry entry = (Entry)it.next();  
    System.out.print(entry.getKey()+"=");  
    System.out.println(entry.getValue());  
}  

 系统变量除了可以获取之外, 还可以通过System.setProperty(key, value)  的方式设置自己需要的系统变量。
默认情况下, java 设置了哪些系统变量:
java.version Java 运行时环境版本 
java.vendor Java 运行时环境供应商 
java.vendor.url Java 供应商的 URL 
java.home Java 安装目录 
java.vm.specification.version Java 虚拟机规范版本 
java.vm.specification.vendor Java 虚拟机规范供应商 
java.vm.specification.name Java 虚拟机规范名称 
java.vm.version Java 虚拟机实现版本 
java.vm.vendor Java 虚拟机实现供应商 
java.vm.name Java 虚拟机实现名称 
java.specification.version Java 运行时环境规范版本 
java.specification.vendor Java 运行时环境规范供应商 
java.specification.name Java 运行时环境规范名称 
java.class.version Java 类格式版本号 
java.class.path Java 类路径 
java.library.path 加载库时搜索的路径列表 
java.io.tmpdir 默认的临时文件路径 
java.compiler 要使用的 JIT 编译器的名称 
java.ext.dirs 一个或多个扩展目录的路径 
os.name 操作系统的名称 
os.arch 操作系统的架构 
os.version 操作系统的版本 
file.separator 文件分隔符(在 UNIX 系统中是"/") 
path.separator 路径分隔符(在 UNIX 系统中是":") 
line.separator 行分隔符(在 UNIX 系统中是"/n") 
user.name 用户的账户名称 
user.home 用户的主目录 
user.dir 用户的当前工作目录

补充
1 . 在.bat ;  .cmd 或  .sh 中会通过 set 的方式设置一些变量,
比如weblogic 的 setDomainEnv.cmd 
set SUN_JAVA_HOME=C:\Oracle\Middleware\jdk160_21
这里设置的是环境变量
2. 在log4j 的配置中, 有时会配置log file 的产生路径。 
比如 ${LOG_DIR}/logfile.log, 这里的LOG_DIR 是被系统属性的变量替换的。
3. 看一下java 源码, 通过 System.getProperties() 的方式获取系统变量时, 会有一个安全的检查
   public static Properties getProperties() {  
SecurityManager sm = getSecurityManager();  
       if (sm != null) {  
    sm.checkPropertiesAccess();  
}  
  
return props;  
   }
 
在 单个Java application  测试时, System 里的SecurityManager 是空的。
在Applet 运行时, 会结合 .policy 这个文件来检查权限。
如果给一个空的SecurityManager 会发现就会抛出权限异常。
public static void main(String[] args) {  
    // TODO Auto-generated method stub  
    System.setSecurityManager(new SecurityManager());  
    //SecurityManager sm = System.getSecurityManager();  
    //System.out.println(sm);  
    System.getSecurityManager().checkPropertiesAccess();  
}  

gcc中的环境变量

阅读数 2695

GCC环境变量设置

阅读数 2984