5、【Linux系统编程】环境变量

前言

  1. 环境变量是操作系统环境设置的变量,适用于整个系统的用户进程;

  2. 环境变量可以在命令中设置,但是用户注销的时候将会丢失这些设置值;

  3. 若要重复适用,则最好在.profile中定义;环境变量的使用与本地变量的使用方法相同,

  4. 但是在使用之前,必须用export命令导出。

一、环境变量文件介绍

  Linux中环境变量包括系统级和用户级,系统级的环境变量是每个登录到系统的用户都要读取的系统变量,而用户级的环境变量则是该用户使用系统时加载的环境变量,所以管理环境变量的文件也分为系统级和用户级的。

二、Linux的变量种类

按变量的生存周期来划分,Linux变量可分为两类:

  1.永久的:需要修改配置文件,变量永久生效

  2.临时的:使用export命令声明即可,变量在关闭shell时失效

三、Linux 环境变量文件

linux变量文件有/etc/environment 或 /etc/profile 或 ~/.profile 或 /etc/bash.bashrc 或 ~/.bashrc, 以及~/.bash_profile(一般是用户在自己目录下新建的),~/.bash_logout.

系统级:

1./etc/environment

  是系统在登录时读取的第一个文件,该文件设置的是整个系统的环境,只要启动系统就会读取该文件,用于为所有进程设置环境变量。系统使用此文件时并不是执行此文件中的命令,而是根据而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE,因此文件中如果要定义PATH环境变量,只需加入一行形如 PATH=$PATH:/xxx/bin的代码即可

2./etc/profile

  此文件是系统登录时执行的第二个文件。 为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。(/etc/profile可以用于设定针对全系统所有用户的环境变量,环境变量周期是永久性)

3. /etc/bash.bashrc

  是针对所有用户的bash初始化文件,在此中设定的环境变量将应用于所有用户的shell中,此文件会在用户每次打开shell时执行一次。(即每次新开一个终端,都会执行/etc/bash.bashrc)。

用户级(这些文件处于家目录下):

1. ~/.profile

  对应当前登录用户的profile文件,用于定制当前用户的个人工作环境(变量是永久性),每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方

2.~/.bashrc

  该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。(~/.bashrc只针对当前用户,变量的生命周期是永久的)

不推荐放到这儿,因为每开一个shell,这个文件会读取一次,效率肯定有影响。

3.~/.bash_profile or ~./bash_login

  ~/.bash_profile是交互式login 方式进入 bash 运行的,~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,他设置一些环境变量,执行用户的.bashrc文件。(如果~/目录下没有.bash_profile则新建立一个)这里是推荐放置个人设置的地方(但是,我在Ubuntu的系统下,并没有发现这两个文件)。

当一个shell关闭时,在bash_profile中定义的系统变量则会失效。因此,每打开一个新的shell时都要运行一次source bash_profile.而且针对当前用户。

4.~/.pam_environment

  用户级的环境变量设置文件,没有做测试,不知道管不管用。(在Ubuntu系统下,同样没有看到这个文件)

5.~/.bash_logout

  当每次退出系统(退出bash shell)时,执行该文件。另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。

四、Linux 环境变量文件执行顺序

1. 在登录Linux时要执行文件的过程如下:

在刚登录Linux时,

首先启动 /etc/profile 文件,

然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,用户主目录下文件的执行的顺序为:  

1   ~/.bash_profile  ->  ~/.bash_login  ->  ~/.profile。

如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。

因为在 ~/.bash_profile文件中一般会有下面的代码:

1 if [ -f ~/.bashrc ] ; then
2    . ./bashrc
3 fi

~/.bashrc中,一般还会有以下代码:

1 if [ -f /etc/bashrc ] ; then
2    . /etc/bashrc
3 fi

所以,~/.bashrc会调用 /etc/bashrc文件。最后,在退出shell时,还会执行 ~/.bash_logout文件。

执行顺序为:

/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout

/etc/profile和/etc/environment等各种环境变量设置文件的用处

  1)先将export LANG=zh_CN加入/etc/profile,退出系统重新登录,登录提示显示英文。

  2)先将/etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_CN加入/etc/environment,退出系统重新登录,登录提示显示中文。

用户环境建立的过程中总是先执行/etc/profile,然后再读取/etc/environment。

为什么会有如上所叙的不同呢?而不是先执行/etc/environment,后执行/etc/profile呢?

这是因为: /etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。

系统应用程序的执行与用户环境可以是无关的,但与系统环境是相关的,所以当你登录时,你看到的提示信息,如日期、时间信息的显示格式与系统环境的LANG是相关的,缺省LANG=en_US,如果系统环境LANG=zh_CN,则提示信息是中文的,否则是英文的。

对于用户的shell初始化而言是先执行/etc/profile,再读取文件/etc/environment;对整个系统而言是先执行/etc/environment。这样理解正确吗?

登陆系统时的顺序应该是:

/etc/enviroment --> /etc/profile -->HOME/.profile??>HOME/.env (如果存在)

/etc/profile 是所有用户的环境变量    /etc/enviroment是系统的环境变量

登陆系统时shell读取的顺序应该是:

/etc/profile ->/etc/enviroment -->HOME/.profile??>HOME/.env

原因应该是用户环境和系统环境的区别了,如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值,那应该是以用户环境为准了。

五、Linux中常见的环境变量及其作用

Linux中常见的环境变量有:

  1.PATH:指定命令的搜索路径

  2.HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

  3.HISTSIZE:指保存历史命令记录的条数。

  4.LOGNAME:指当前用户的登录名。

  5.HOSTNAME:指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。

  6.SHELL:指当前用户用的是哪种Shell。

  7.LANG/LANGUGE:和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。

  8.MAIL:指当前用户的邮件存放目录。

  9.PS1:命令基本提示符,对于root用户是#,对于普通用户是$。

  10.PS2:附属提示符,默认是“>”。

备注:可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符修改成字符串“Hello,MyNewPrompt ”。

# PS1="Hello,My NewPrompt"

注意:上述变量的名字并不固定,如HOSTNAME在某些Linux系统中可能设置成HOST

当然,这里列举的上述环境变量并非穷尽列出!

Linux也提供了修改和查看环境变量的命令!下面通过几个实例来说明:

  1.echo 显示某个环境变量值 echo $PATH

  2.export 设置一个新的环境变量 export HELLO="hello" (可以无引号),在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

  3.env 显示所有环境变量

  4.set 显示本地定义(系统中已经存在)的shell变量以及设置shell变量的新变量值,如果未指定值,则该变量值将被设为NULL。

  5.unset 清除环境变量 unset HELLO

  6.readonly 设置只读环境变量 readonly HELLO ,如果使用了readonly命令的话,变量就不可以被修改或清除了

原文地址:https://www.cnblogs.com/Long-w/p/9680248.html

时间: 2024-08-26 05:41:11

5、【Linux系统编程】环境变量的相关文章

嵌入式 Linux系统编程(六)——系统信息

嵌入式 Linux系统编程(六)--系统信息 一.时间 Linux系统下常用的时间类型:time_t.struct tm.struct timeval.struct timespec. 1.time_t类型时间 time_t实际是一个长整型.其值表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数.由于time_t类型长度的限制,它所表示的时间不能晚于2038年1月19日03时14分

Linux系统编程【转】

转自:https://blog.csdn.net/majiakun1/article/details/8558308 一.Linux系统编程概论 1.1 系统编程基石 syscall: libc:标准C库.系统调用封装.线程库.基本应用工具 gcc: 1.2 模块接口 API:应用程序编程接口,源代码级别,能通过编译,由标准C语言定义,libc来实现 ABI:应用程序二进制接口,二进制级别,能正常运行,关注调用约定.字节序.寄存器使用.系统调用.链接.二进制格式等,很难实现 1.3 错误处理 <

Linux重要的环境变量

PWD和OLDPWDPWD代表当前工作目录,改变目录后系统会自动更新该环境变量OLDPWD代表之前的工作目录实验:先进入/home目录,再cd到/etc目录,查看这两个变量 PATH这个环境变量大家应该比较熟悉,可执行文件的搜索路径,避免每次都要写全路径或者相对路径.默认多个可执行文件路径以冒号分隔 HOME该环境变量保存当前用户的家目录的路径,每次切换用户,系统都会自动从/etc/passwd文件中读取用户的家目录 SHELL跟HOME环境变量相似,该环境变量保存的是当前登录用户的默认shel

hadoop搭建杂记:Linux下JDK环境变量的设置(三种配置环境变量的方法)

Linux下JDK环境变量的设置(三种配置环境变量的方法) Linux下JDK环境变量的设置(三种配置环境变量的方法) ①修改/etc/profile文件 如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题. vi /etc/profile 在profile文件末尾加入: JAVA_HOME=/usr/share/jdk1.5.0_05PATH=$JAVA_HOME/bin:$PATHCLASSPATH=.:$JAVA_H

LINUX系统编程 由REDIS的持久化机制联想到的子进程退出的相关问题

19:22:01 2014-08-27 引言: 以前对wait waitpid 以及exit这几个函数只是大致上了解,但是看REDIS的AOF和RDB 2种持久化时 均要处理子进程运行完成退出和父进程需要做的什么事情,所以特定看了UNIX环境编程和LINUX系统编程这2本书 重新梳理下整个要点. 内容: 一般而言: 如果程序类似于下面的情况: if((pid=fork())==0) { dochildtthing(); exit(0); } else if(pid>0) { dofathertt

Linux基础概念-----环境变量

Shell 环境变量 Shell也是应用程序,工作与用户模式 变量类型 整形 浮点型 字符型 布尔型 bash变量类型 本地变量:仅对当前Shell有效 局部变量:仅对局部代码段有效(函数) 环境变量:expor VAR_NAME=Value,对当前Shell及子Shell有效 位置变量:$1;$2 .... 特殊变量:$?;$!;$$ .... 查看环境变量 printenv export 查看所有变量 set bash的引号 双引号:弱引用,可以实现变量替换: 单引号:强引用,不替换,而显示

Linux系统编程@进程通信(一)

进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统的一个分支) POSIX进程间通信(POSIX:可移植操作系统接口,为了提高UNIX环境下应用程序的可移植性.很多其他系统也支持POSIX标准(如:DEC OpenVMS和Windows).) 现在Linux使用的进程间通信方式包括: 管道(pipe).有名管道(FIFO) 信号(signal) 消

linux配置java环境变量(详细) -copy

一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586.bin 这时会出现一段协议,连继敲回车,当询问是否同意的时候,输入yes,回车.之后会在当前目录下生成一个jdk1.6.0_14目录,你可以将它复制到 任何一个目录下. 二. 需要配置的环境变量 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序.我们

Linux系统编程——进程替换:exec 函数族

在 Windows 平台下.我们能够通过双击运行可运行程序.让这个可运行程序成为一个进程:而在 Linux 平台.我们能够通过 ./ 运行,让一个可运行程序成为一个进程. 可是,假设我们本来就执行着一个程序(进程),我们怎样在这个进程内部启动一个外部程序.由内核将这个外部程序读入内存,使其执行起来成为一个进程呢?这里我们通过 exec 函数族实现. exec 函数族.顾名思义.就是一簇函数,在 Linux 中,并不存在 exec() 函数.exec 指的是一组函数.一共同拥有 6 个: [cpp