Linux环境变量编程

一、Linux系统环境变量的分类

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

**环境变量**:又称为全局变量,存在于所有的Shell中;它是永久生效的,且具有继承性,即子Shell会继承父Shell的环境变量;

**本地变量**:当前Shell中的变量,很显然本地变量中肯定包含环境变量;Linux本地变量的非环境变量不具备继承性。

二、Linux系统环境变量相关的文件

当你进入系统的时候,Linux就会为你读入系统的环境变量,这些环境变量都存放在不同的环境变量文件中,Linux系统按如下顺序读取环境变量文件来录入环境变量。

2.1 系统环境变量:/etc/profile

此文件为系统的环境变量,它为每个用户设置环境信息,当用户第一次登陆时,该文件被执行,并从/etc/profile.d目录的配置文件中搜索shell的设置。这个文件是任何用户登录操作系统以后都会读取的文件(如果用户的shell是csh、tcsh、zsh,则不会读取此文件),用于获取系统的环境变量,只在登录的时候读取一次。

2.2 /etc/bashrc

在执行完/etc/profile内容之后,如果用户的Shell运行的是bash,那么接着读取/etc/bashrc文件。另外,当每次一个新的bash shell被打开时,该文件被读取一次。因此,如果想让每个使用bash的用户每新开一个bash和每次登录都执行某些操作,或者给他们定义一些新的环境变量,就可以在这个里面设置。

2.3 用户环境变量~/.bash_profile

每个用户都可以使用该文件传入专用于自己使用的shell信息。当用户登录时,该文件仅仅执行一次,默认情况下,它设置一些环境变量,执行用户的.bashrc文件。对单个用户目录下此文件的修改,只会影响到该用户以后每一次登录系统。因此,可以在这里设置单个用户的特殊环境变量或特殊操作。

2.4 ~/.bashrc

该文件包含专用于单个人的bash shell的bash信息,当登录时以及每次打开一个新的shell时,该文件被读取。单个用户对此文件的修改会影响到他以后的每一次登录系统和每一次新打开一个bash。因此,可以在这里设置单个用户的特殊环境变量或者特殊操作。

2.5 ~/bash_logout

当用户每次退出系统(退出bash shell)时,执行该文件。

三、Linux系统常用的环境变量

在Linux系统中,常见的环境变量及其含义如下所示:

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

四、Linux环境变量修改方法

4.1 修改/etc/profile文件

用VI在文件==/etc/profile==中添加、删除或修改变量,该变量将会对Linux下所有用户有效,并且是永久的。

注意:在修改完成该文件后,必须运行“# source /etc/profile”之后才能生效,否则只能下次登录时才生效。

4.2 修改~目录下的.bash_profile文件

用VI在用户目录下的==.bash_profile==文件中添加、删除或修改变量,该变量仅会对当前用户有效,并且是永久的;

注意:在修改完成该文件后,必须运行“# source /etc/profile”之后才能生效,否则只能下次登录时才生效。

4.3 使用export命令设置环境变量

在Shell的命令行下直接使用如下方式定义变量:

==$ export 变量名=变量值==

该变量只在当前的Shell(BASH)或其子Shell(BASH)下是有效的,Shell关闭了,变量也就失效了,再打开新Shell时就没有这个变量,需要使用的话还需要重新定义。

$ export HELLO=”hello!”
$ echo $HELLO
hello!

五、通过命令方式修改环境变量

5.1 使用echo命令查看单个环境变量

查看一个指定的环境变量。

$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/study/bin:/bin/3.4.5/bin

5.2 使用env/printenv命令查看所有环境变量

用于打印所有的环境变量。

$ env
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
KDE_NO_IPV6=1
SSH_CLIENT=192.168.6.9 58178 5200
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
SSH_TTY=/dev/pts/1
USER=study
……

5.3 使用set查看所有本地定义的环境变量

用于显示与设置当前本地变量。单独使用set,就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量。

$ set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=131
……

5.4 使用unset删除指定的环境变量

用于清除变量,不管这个变量是环境变量还是本地变量,它都可以清除。如果未指定值,则该变量的值被设为NULL。

$export HELLO=”hello”
$ unset HELLO
#echo $HELLO

5.5 使用export命令改变环境变量

用于把变量变成当前shell和其子shell的环境变量,其存活期是当前的shell及其子shell,因此重新登陆后,它所设定的环境变量就消失了。要想环境变量永久化,那就修改第二节介绍的几个环境变量配置文件。

5.6 使用readonly命令设置只读环境变量

如果使用了readonly命令的话,变量就不可以被修改或清除了。

$ export TEST=”Test…”
$ readonly TEST
$ unset TEST
-bash: unset: Test: cannot unset: readonly variable
$ TEST=”New”
-bash: TEST: readonly variable

5.7 使用source命令让脚本在当前shell中执行

当直接执行一个脚本的时候,其实是在一个子shell环境运行的,即开启了一个子shell来执行这个脚本,脚本执行完后,该子shell自动退出。当然,我们也可以使用source命令让脚本在当前的shell中执行。如:

$ cat test.sh  #查看脚本内容
echo $myname 
$ echo $myname  #查看变量
ilonng
$ set | grep myname  #变量是本地变量
myname=ilonng
$ env | grep myname  #变量不是环境变量
$ sh test.sh #新开子shell执行,非环境变量的本地变量不具备继承性,在子shell中不可见
#什么也没有输出

六、通过系统调用方式修改环境变量

在编写Linux应用程序的过程中,应用程序常常会使用到Linux系统的一些环境变量,因此需要从系统中去获取系统环境变量;但有时一个应用程序使用的自己配置的环境变量(如子进程的环境与父进程的环境不同),则需要修改本程序的环境变量。本篇文章主要介绍如何从系统获取系统环境变量和如何设置本程序的环境变量(<font color="dd0000">不影响系统的环境变量</font>)的函数的使用:getenv()、putenv()、setenv()、unsetenv()。

使用以上几个函数需包含如下头文件:

#include <stdlib.h>

6.1 获取系统环境变量:getenv()

【函数定义】:char *getenv(const char *name);

【函数说明】:getenv()用来取得参数name环境变量的内容;

【参数说明】:name为环境变量的名称,环境变量的格式为name=value;如果该变量存在则会返回指向该环境变量值的指针,即指向value的指针;如果该变量不存在,则返回NULL指针;

【返回值】:执行成功返回指向该环境变量的值的指针,找不到符合的环境变量名称则返回NULL;

【范 例】:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char *p;
    p = getenv("PATH");
    if(p == NULL)
    {
        printf("Get env failed.\n");
        return -1;
    }
    printf("PATH=%s\n",p);
    return 0;
}

6.2 改变/增加环境变量:putenv()

【函数定义】:char *putenv(const char *string);

【函数说明】:putenv()用来改变或增加环境变量的内容;

【参数说明】:string的格式为“name=value”,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量;

【错误代码】:ENOMEM,内存不足,无法配置新的环境变量空间;

【返回值】:执行成功返回0,有错误发生返回-1;

【范 例】:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int ret;
    char *p;
    p = getenv("DB_HOME");
    if(p == NULL)
    {
        printf("Getenv failed.\n");
        return -1;
    }
    printf("DB_HOME=%s\n",p);
    ret = putenv("DB_HOME=/opt/www/cgi-bin/");
    if(ret != 0)
    {
        printf("Putenv failed.\n");
        return -1;
    }
    p = getenv("DB_HOME");
    if(p == NULL)
    {
    printf("Getenv failed.\n");
        return -1;
    }
    printf("After putenv:DB_HOME=%s\n",p);
    return 0;
}

6.3 改变/增加环境变量:setenv()

【函数定义】:char *setenv(const char *name,const char *value,int overwrite);

【函数说明】:setenv()用来改变或增加环境变量的内容;

【参数说明】:name:为环境变量名称字符串;value:为环境变量的内容;overwrite:用来决定是否要改变已存在的环境变量:如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容;如果overwrite为0,且该环境变量已有内容,则参数value会被忽略;

【错误代码】:ENOMEM,内存不足,无法配置新的环境变量空间;

【返回值】:执行成功返回0,有错误发生返回-1;

【范 例】:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int ret;
    char *p;
    p = getenv("PATH");
    if(p == NULL)
    {
        printf("Getenv failed.\n");
        return -1;
    }
    printf("PATH=%s\n",p);
    ret = setenv("PATH","/bin/:/sbin/:/user/sbin/:/user/bin/:/opt/cst_app/bin/",1);
    if(ret < 0)
    {
        printf("Setenv failed.\n”");
        return -1;
    }
    printf("Setenv OK.\n");
    p = getenv("PATH");
    if(p == NULL)
    {
        printf("Getenv failed.\n");
        return -1;
    }
    printf("PATH=%s\n”",p);
    return 0;
}

6.4 删除一个环境变量:unsetenv()

【函数定义】:char *unsetenv(const char *name);

【函数说明】:unsetenv()用来删除name定义的环境变量,即使不存在也不算出错;

【参数说明】:name为要删除的环境变量的名称;

【返回值】:执行成功返回0,有错误发生返回-1;

【范 例】:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    char *p;
    p = getenv("PATH");
    if(p == NULL)
    {
        printf("Get env failed.\n");
        return -1;
    }
    printf("PATH=%s\n",p);
    unsetenv("PATH");
    p = getenv("PATH");
    if(p == NULL)
    {
        printf("Get env failed.\n");
        return -1;
    }
    printf("PATH=%s\n",p);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,738评论 0 10
  • 本文内容:Shell 的3钟启动方式;不同启动方式下环境变量的加载文件及其顺序;环境变量的持久化 Shell 是什...
    seyvoue阅读 2,828评论 0 4
  • How to express yourself? How to express your love? How to...
    Thallos阅读 472评论 0 1
  • 从小到大,一直觉得相亲这种事不会发生在我身上,觉得自己会像白雪公主遇见白马王子一样,在青春的年纪里,但是并没有。 ...
    赤香阅读 386评论 4 1