unix环境变量_unix 环境变量 - CSDN
  • UNIX再学习 -- 环境变量

    千次阅读 2017-06-05 16:43:18
    一、环境变量参看:百度百科--环境变量环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。环境变量时在操作系统中一个具有特定名字的对象,它包含了一个或

    之前讲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  


    展开全文
  • Linux/Unix配置环境变量

    千次阅读 2014-12-29 09:38:57
    Linux/Unix配置环境变量 Linux/Unix系统环境变量配置文件:  /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。  /etc/...

    Linux/Unix配置环境变量

    Linux/Unix系统环境变量配置文件: 
    /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。 

    /etc/environment:在登录时操作系统使用的第二个文件, 系统在读取你自己的profile前,设置环境文件的环境变量。 

    ~/.profile:在登录时用到的第三个文件 是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。 

    /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.AIX中没有该文件,会有/etc/cshrc


    ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
    (~  为当前用户home目录)


    看看这几个文件都是干什么的: 
    1./etc/environment–>是系统在登录时读取的第一个文件,用于为所有进程设置环境变量。系统使用此文件时并不是执行此文件中的命 令,而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE,因此文件中如果要定义PATH环境变量,只需加入一行形如 PATH=$PATH:/xxx/bin的代码即可。 
    2./etc/profile–>是系统登录时执行的第二个文件,可以用于设定针对全系统所有用户的环境变量。 
    3.~/.profile–>是对应当前登录用户的profile文件,用于定制当前用户的个人工作环境。 
    4./etc/bash.bashrc–>是针对所有用户的bash初始化文件,在此中设定的环境变量将应用于所有用户的shell中,此文件会在用户每次打开shell时执行一次。 
    5.~/.bashrc–>是对应当前登录用户的bash初始化文件,当用户每次打开shell时,系统都会执行此文件一次。

    这几个文件的执行先后顺序应当是: 
    /etc/enviroment –>/etc/profile –>~/.profile –>/etc/bash.bashrc–> ~/.bash

    PASH环境变量的设置方法: 

    方法一:用户主目录下的.profile或.bashrc文件(推荐) 

    登录到你的用户(非root),在终端输入: 

    $ sudo gedit ~/.profile(or .bashrc) 
    可以在此文件末尾加入PATH的设置如下: 
    export PATH="$PATH:your path1:your path2 ..."
    保存文件,注销再登录,变量生效。

    该方式添加的变量只对当前用户有效。 

    方法二:系统目录下的profile文件(谨慎) 

    在系统的etc目录下,有一个profile文件,编辑该文件: 

    $ sudo gedit /etc/profile 
    在最后加入PATH的设置如下: 

    export PATH="$PATH:your path1:your path2 ..."
    该文件编辑保存后,重启系统,或输入以下命令刷新环境变量,变量生效。
    #source /etc/profile
    该方式添加的变量对所有的用户都有效。 

    方法三:系统目录下的 environment 文件(谨慎) 

    在系统的etc目录下,有一个environment文件,编辑该文件: 
    $ sudo gedit /etc/environment 
    找到以下的 PATH 变量: 
    PATH="<......>" 
    修改该 PATH 变量,在其中加入自己的path即可,例如: 
    PATH="<......>:your path1:your path2 …" 
    各个path之间用冒号分割。该文件也是重启生效,或输入以下命令刷新环境变量,影响所有用户。

    #source /etc/environment
    注意这里不是添加export PATH=… 。 

    方法四:直接在终端下输入 

    $ sudo export PATH="$PATH:your path1:your path2 …" 
    这种方式变量立即生效,但用户注销或系统重启后设置变成无效,适合临时变量的设置。 

    注 意:方法二和三的修改需要谨慎,尤其是通过root用户修改,如果修改错误,将可能导致一些严重的系统错误,如果修改不当,可能导致其他系统命令也无法识别(系统找不到路径),因此笔者推荐使用第一种方法(只要不是root用户,修改不当还可以使用root再改回来,重新登录即可)。另外嵌入式 Linux的开发最好不要在root下进行(除非你对Linux已经非常熟悉了!),以免因为操作不当导致系统严重错误。root为Unix/Linux系统的最高权限用户,不像windows的Administrator,Administrator其实不是最高权限(这里不细究),root可以让你在系统上修改任何东西,伴随而来的也十分危险。



    展开全文
  • Unix环境变量设置

    2013-04-10 14:45:39
    Unix环境变量设置[转]     我们在Linux下安装系统软件的时候,经常遇到一些系统环境变量配置的问题。什么是环境变量?如何定制环境变量?我将在下面做一些介绍。一、什么是环境变量?Linux是一个多...

    Unix环境变量设置[转]

     
     
    我们在Linux下安装系统软件的时候,经常遇到一些系统环境变量配置的问题。什么是环境变量?如何定制环境变量?我将在下面做一些介绍。

    一、什么是环境变量?
    Linux是一个多用户的操作系统。多用户意味着每个用户登录系统后,都有自己专用的运行环境。而这个环境是由一组变量所定义,这组变量被称为环境变量。用户可以对自己的环境变量进行修改以达到对环境的要求。

    二、定制环境变量
    环境变量是和Shell紧密相关的,它是通过Shell命令来设置的。环境变量又可以被所有当前用户所运行的程序所使用。对于bash来说,可以通过变量名来访问相应的环境变量。
    下面通过几个实例来说明

    1.显示环境变量HOME
    $&nbspecho $HOME
    /home/admin

    2.设置一个新的环境变量NAME
    $&nbspexport&nbspNAME="RaidCheng"
    $&nbspecho $NAME
    RaidCheng

    3.使用env命令显示所有的环境变量
    $&nbspenv
    HOSTNAME=test
    TERM=vt100
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=202.xxx.xxx.xxx&nbsp53694&nbsp22
    CATALINA_BASE=/usr/local/jakarta-tomcat
    SSH_TTY=/dev/pts/0
    ANT_HOME=/usr/local/ant
    JAVA_OPTS=-server
    USER=admin
    ...

    4.使用set命令显示所有本地定义的Shell变量
    $&nbspset
    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'
    CATALINA_BASE=/usr/local/jakarta-tomcat
    CATALINA_HOME=/usr/local/jakarta-tomcat
    ...

    5.使用unset命令来清除环境变量
    $&nbspexport&nbspNAME="RaidCheng"
    $&nbspecho $NAME
    RaidCheng
    $&nbspunset&nbspNAME
    $&nbspecho $NAME

    6.使用readonly命令设置只读变量
    $&nbspexport&nbspNAME="RaidCheng"
    $&nbspreadonly&nbspNAME
    $&nbspunset&nbspNAME
    -bash:&nbspunset:&nbspNAME:&nbspcannot&nbspunset:&nbspreadonly&nbspvariable
    $&nbspNAME="New" #会发现此也变量不能被修改
    -bash:&nbspTEST:&nbspreadonly&nbspvariable

    三、常见的环境变量
    PATH      决定了shell将到哪些目录中寻找命令或程序
    HOME      当前用户主目录
    HISTSIZE    历史记录数
    LOGNAME     当前用户的登录名
    HOSTNAME    指主机的名称
    SHELL      前用户Shell类型
    LANGUGE     语言相关的环境变量,多语言可以修改此环境变量
    MAIL      当前用户的邮件存放目录
    PS1       基本提示符,对于root用户是#,对于普通用户是$
    PS2       附属提示符,默认是“>”

    四、通过C程序来访问和设置环境变量
    对于C程序的用户来说,可以使用下列三个函数来设置或访问一个环境变量。

    getenv()访问一个环境变量。输入参数是需要访问的变量名字,返回值是一个字符串。如果所访问的环境变量不存在,则会返回NULL

    setenv()在程序里面设置某个环境变量的函数

    unsetenv()清除某个特定的环境变量的函数

    另外,还有一个指针变量environ,它指向的是包含所有的环境变量的一个列表。下面的程序可以打印出当前运行环境里面的所有环境变量:

    #include
    extern&nbspchar**environ;
    int&nbspmain ()
    {
    char**var;
    for (var =environ;*var !=NULL;++var)
    printf ("%s \n ",*var);
    return&nbsp0;
    }

    五、环境变量文件
    通过修改一些相关的环境定义文件来修改环境变量,比如对于RedHat,与环境相关的文件有/etc/profile和~/.bash_profile等。修改完毕后重新登录一次或运行命令source&nbspxxx就生效了。 
    展开全文
  • 头文件:#include<unistd.h> ssize_t pread (int filedes, void *buf, size_t nbytes, off_t offset ); ssize_t pwrite (int filedes, const void *buf, size_t nbytes, off_t offset );...

     一、文件操作:

    头文件:#include<unistd.h>
    
    ssize_t  pread (int filedes,   void *buf,  size_t  nbytes,  off_t  offset );
    ssize_t  pwrite (int filedes,   const void *buf,  size_t  nbytes,  off_t  offset );
    
    成功:返回读到的字节数;出错:返回-1;到文件结尾:返回0
    
    作用:由于lseek和read/write 调用之间,内核可能会临时挂起进程,所以对同步问题造成了问题,调用pread/pwrite相当于顺序调用了lseek 和 read/write,这两个操作相当于一个捆绑的原子操作。
    头文件:#include<sys/stat.h>
    
    mode_t umask(mode_t cmask);
    
    返回值:成功返回之前的屏蔽字
    
    作用:为进程创建文件模式屏蔽字,即创建的文件默认不再有cmask权限,除非主动调用chmod()函数修改
    头文件:#include<unistd.h>
           #include<sys/types.h>
    
    int truncate(const char *path,off_t length);
    int ftruncate(int fd,off_t length);
    
    返回值:成功返回0,失败返回-1
    
    作用:将一个名称为path或者被文件描述符fd引用的常规文件被截断成一个大小精为length字节的文件。如果先前的文件大于这个大小,额外的数据丢失。如果先前的文件小于当前定义的大小,那么,这个文件将会被扩展,扩展的部分将补以null,也就是‘\0’。
    头文件:#include <stdio.h>
    int rename(const char *oldname, const char *newname);
    
    返回值:成功返回0,失败返回-1
    
    作用:将指定目录/文件进行重命名,注意newname如果已存在,需要分情况处理:
    (1) 如果oldname为一个文件而不是目录,那么为该文件更名。在这种情况下,如果newname作为一个目录已存在,则它不能重命名一个目录。如果newname已存在,而且不是一个目录,则先将其删除(rename会负责删除操作)然后将oldname更名为newname。对oldname所在目录以及newname所在的目录,调用进程必须具有写许可权,因为将更改这两个目录。
    (2) 如若oldname为一个目录,那么为该目录更名。如果newname已存在,则它必须是一个目录,而且该目录应当是空目录(空目录指的是该目录中只有. 和.. 项)。如果newname存在(而且是一个空目录),则先将其删除,然后将oldname更名为newname。另外,当为一个目录更名时,newname不能包含oldname作为其路径前缀。例如,不能将/usr更名为/usr/foo/testdir,因为老名字( /usr/foo)是新名字的路径前缀,因而不能将其删除。
    (3) 作为一个特例,如果oldname和newname引用同一文件,则函数不做任何更改而成功返回。
    头文件:#include<stdio.h>
    
    FILE* fopen(const char *path, const char *mode);
    
    FILE* fdopen(int fd, const char *mode);
    
    FILE* freopen(const char *path, const char *mode, FILE *stream);
    
    作用:打开指定路径的文件操作流,fopen指定的绝对路径,freopen可以指定相对路径
    int fclose(FILE *fp);
    作用:关闭指定的文件操作,此时缓冲区里面的数据会被刷新
    void setbuf(FILE *stream, char *buf);
    
    int setvbuf(FILE *stream, char *buf, int mode, size_t size);
    
    作用:为指定的文件流指定缓冲区。其中mode可以取以下值:
      _IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
      _IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
      _IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。

     关于缓冲区相关知识,建议阅读:Unix环境变量--缓冲区

    int fflush(FILE *stream);
    作用:主动刷新文件流的缓冲区
    int ferror(FILE *stream);
    作用:获取去文件流错误,文件流无错误时,返回一个零值,发生错误时返回一个非零值。
    
    int feof(FILE *stream); 
    作用:判断文件流是否到达文件尾
    
    void clearerr(FILE *stream);
    作用:清除文件流错误状态

     

    获取文件指针:    
        int ftell(FILE *stream); //获取文件指针相对于开头的偏移
        int fseek(FILE *stream, long offset, int whence);
        void rewind(FILE *stream);//设置文件位置为给定流 stream 的文件的开头
        int fgetpos(FILE *stream, fpos_t *pos);//获取流 stream 的当前文件位置,并写入到pos
        int fsetpos(FILE *stream, fpos_t *pos);//设置文件位置为给定pos位置
        off_t ftello(FILE *stream);//同ftell,只是参数类型不同
        int fseeko(FILE *stream, off_t offset, int whence);//同fseek,只是参数类型不同
       
    
    字符IO:
    
        int getc(FILE *stream);
    
        int fgetc(FILE *stream);
    
        int getchar(void);
    
        int ungetc(int c, FILE *stream);
    
        int putc(int c, FILE *stream);
    
        int fputc(int c, FILE *stream); int putchar(int c);
    
    行IO:
    
        char* gets(char *s);
    
        char* fgets(char *s, int size, FILE *stream);
    
        int puts(const char *s);
    
        int fputs(const char *s, FILE *stream);
    
    二进制IO:
    
        size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
    
        size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
    
    
    临时文件:
    
        FILE *tmpfile(void);
        //以二进制更新模式(wb+)在 /tmp 文件夹中创建一个临时文件。被创建的临时文件会在流关闭的时候或者在程序终止的时候自动删除
    
        char *tmpnam(char *s);
        //生成并返回一个有效的临时文件名,该文件名之前是不存在的。如果 str 为空,则只会返回临时文件名
    
        char *tempnam(const char *dir, const char *pfx);
        //按照指定的目录dir及前缀pfx生成一个临时文件,并将文件绝对路径名返回
    
         char* mktemp(char *template);
        //按照template传入的字符创建临时文件,注意template 必须以 XXXXXX 结尾,随后创建的临时文件名保证其前缀不变,用随机字符替换这6个X
    
         int mkstemp(char *template);
         //意义基本同mktemp,但是该函数不仅创建临时文件,还会以当前用户可读可写的方式打开文件,并返回其文件描述符
        

    二、目录操作

    (1)打开/关闭目录文件

    #include <dirent.h>
    DIR* opendir(const char* dirname);
    int closedir(DIR* dirp);

    opendir()函数用于打开一个目录文件,其中dirname为目录路径,执行成功,返回一个目录流指针,失败返回NULL
    closedir()函数用于关闭指定的目录流,成功返回0,失败返回-1

    (2)读取目录内容

    #include <dirent.h>
    struct dirent* readdir(DIR* dirp);
    int readdir_r(DIR* dirp,struct dirent* entry,struct dirent ** result);

    其中struct dirent定义如下:

    // from dirent.h
    struct dirent
    {
        long ino;                    //目录中某文件的innode值
        _kerbel_off_t d_off;         // 从目录开始到当前目录条的距离
        unsigned short d_reclen;     // 目录中某文件名的长度
        char d_name[256];            //  目录中某文件名
    }

    readdir()函数执行成功则返回一个指向struct dirent的结构体,,如果到达目录结尾,或失败,则范湖NULL。
    readdir_r()函数在多线程编程中相对安全,且此函数第一个参数为打开的目录指针,它将初始化第二个参数引用的struct dirent结构,以表示第一个参数所引用的目录流的当前位置,并将所在位置的信息存储在第三个参数中。函数执行成功,将返回目录流中的一个文件信息,到达目录尾在返回0,执行失败返回-1。

    (3)定位目录位置

    long int telldir(DIR* dirp);             //返回目录流的当前位置
    void seekdir(DIR* dirp,long int loc);   // 设置下一个readdir()位置
    void rewinddir(DIR* dirp);              //将目录流的位置重置到目录的开头

     

    (4)当前工作路径操作

    char* getcwd(char* buf,size_t size); //获取当前工作路径的绝对路径到buf中,并返回buf
    int chdir(const char* path);//修改当前进程的环境变量的当前工作路径,成功返回0,失败返回-1
     

    展开全文
  • Unix环境变量

    2006-07-31 11:41:00
    一、SHELL的功能及分类 SHELL是UNIX作业系统中的'命令编译器'(CommandInter- preter),它基本上是一个常驻的执行程式,它在使用者一签入 成功後就立即被载入(可在签入後以ps指令看到),主要功能则 在於接受使用者的...
  • unix环境变量

    千次阅读 2005-09-29 09:04:00
    1.查看所有环境变量:env2.查看某个变量值: echo $变量名3.设置一个新变量: export 变量名=变量值4.设置如果已存在的变量值export classpath=$classpath:/path/to/program注:unix下不同的变量之间用冒号":"隔开5....
  • Unix环境变量

    2019-04-06 17:20:17
    博客搬家,原地址:https://langzi989.github.io/2017/05/22/Unix环境变量/ 概述 在Unix中,每个进程都有自己的一组环境变量,这些环境变量,要么是一组全局字符串,要么是子进程从父进程继承而来的,如果子进程不对...
  • 比如,哪天某个Java进程出现问题,我们想分析一下其线程堆栈,却发现环境变量中没有jstack命令……   实例   JDK路径  忘记安装路径的话,我这已经配置了Java环境,就直接借助whi
  • unix环境变量的设置方法

    千次阅读 2010-02-04 13:38:00
    vi ~/.bashrcvi /etc/profilecd ~/ (home dir)vi .profile 
  • Unix操作系统中可以在shell中通过set命令给环境变量赋值。但是如果采用这种方式对环境变量进行赋值的话,当重新启动操作系统或者重新启动这个会话的话,原先设置的环境变量就会丢失。也就是说,如果在shell会话中...
  • 设置Unix环境变量:----------------------------------- 设置环境变量的语法格式取决于你使用的shell.首先你要先确定你所登录的shell,如:Bourne (sh),Korn (ksh),C shell (csh),也许还有其他shell,但是这些shell...
  • 一、进入 etc/ 目录,编辑 profile 文件。在该文件末尾加上以下几行: export JAVA_HOME=/usr/java/jdk1.7.0 (JDK的安装目录) export CLASSPATH=$JAVA_...二、输入以下命令,让刚设置的环境变量生效: source
  • Unix环境变量设置[转]

    2011-02-10 11:45:00
    我们在Linux下安装系统软件的时候,经常遇到一些系统环境变量配置的问题。什么是环境变量?如何定制环境变量?我将在下面做一些介绍。 <br /> 一、什么是环境变量? Linux是一个多用户的操作系统...
  • Unix 环境变量

    2013-06-09 14:21:47
    Linux下处理环境变量常见的几个操作: env:显示当前所有的环境变量 set:显示当前bash下用户自定义的变量和环境变量 export:把自定义的变量转换成环境变量 环境表: Unix下的每一个程序都会有一张环境表,...
  • Unix下修改设置环境变量

    千次阅读 2013-02-27 11:13:59
    csh, bsh, ksh和bash的初始化文件不同:   csh: 把下面几行添加到文件$HOME/.cshrc:  setenv JAVA_HOME /usr/java  setenv PATH $JAVA_HOME/bin  setenv CLASSPATH . ...bsh/ksh:把下面几行添加到文件$HOME...
  • 程序访问unix环境变量

    千次阅读 2009-05-12 07:52:00
    程序中有两种方法访问环境变量,分别是全局变量法和函数调用法一、全局变量法。程序中声明外部变量 environ来存取系统环境变量如下: #include extern char **environ;void main(){char **p = environ;while (*p){...
  • ISO C定义了一个
  • HPUNIX下设置环境变量NLS_LANG

    千次阅读 2006-10-08 14:29:00
    1、使用vi编辑profile: vi .profile2、在该文件中加入:export NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK3、使用如下命令,启用环境变量配置: $ . ./.profile4、查看环境变量设置: echo $NLS_LANG 
  • 如何使Unix环境变量设置永远有效

    千次阅读 2009-08-24 10:48:00
    Unix操作系统中可以在shell中通过set命令给环境变量赋值。但是如果采用这种方式对环境变量进行赋值的话,当重新启动操作系统或者重新启动这个会话的话,原先设置的环境变量就会丢失。也就是说,如果在shell会话中...
1 2 3 4 5 ... 20
收藏数 181,779
精华内容 72,711
关键字:

unix环境变量