当前位置: 首页 > news >正文

【Linux】环境变量完全解析

9.环境变量

文章目录

  • 9.环境变量
      • 一、命令行参数
      • 二、获取环境变量
        • 程序中获取环境变量
          • 1. 使用命令行参数
          • 2. 使用系统调用函数`getenv("字符串");`
          • 3. 使用系统提供的全局变量`environ`
        • 命令行中查询环境变量
      • 三、常见环境变量
        • 1. HOME
        • 2. OLDPWD
        • 3. PATH
        • 4. SHELL
      • 四、环境变量与本地变量
        • 本地变量与环境变量的对比
        • 本地变量修改为环境变量
      • 五、总结

一、命令行参数

在Linux中,命令行参数用于向程序传递信息。这些参数可以在命令行中指定,并由程序解析和使用。

Linux中的指令其实也是一个可执行程序,Linux下一切皆文件,在使用Linux的某一些指令的时候,后面经常会带有选项,这个选项就是命令行参数。

举例:我们在终端中执行以下代码

#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[])
{printf("argc: %d\n", argc);for(int i = 0; i < argc; i++){printf("argv[%d]: %s\n", i, argv[i]);}return 0;
}

执行结果:

[lisihan@hcss-ecs-b735 lession13]$ make
gcc -o code code.c -std=c99
[lisihan@hcss-ecs-b735 lession13]$ ./code
argc: 1
argv[0]: ./code
[lisihan@hcss-ecs-b735 lession13]$ ./code 1 2 3 4 5 
argc: 6
argv[0]: ./code
argv[1]: 1
argv[2]: 2
argv[3]: 3
argv[4]: 4
argv[5]: 5
[lisihan@hcss-ecs-b735 lession13]$ ./code aaa bbb ccc ddd
argc: 5
argv[0]: ./code
argv[1]: aaa
argv[2]: bbb
argv[3]: ccc
argv[4]: ddd

可以看到在执行code的时候后面可以带参数,并且这个参数可以由main函数传参之后再code中打印出来。

  • 这里把main函数的这个参数,把它我们称之为叫做命令行参数列表,其中argc表示的是参数的个数,argv表示的是我们是一个数组,它表示的是参数的清单。

  • 同一个程序,可以根据命令行参数,根据选项的不同,表现出不同的功能。比如:指令中选项的实现!

  • 在Linux系统中,用户在命令行界面输入的指令本质上是字符串序列。命令行解释器(Shell)首先接收这些字符串,并依据空格作为分隔符对其进行解析分割。Shell自身是一个运行中的进程,当它执行用户指定的程序时,该程序会作为Shell的子进程启动。如前所述,进程具有独立性。父子进程会继承父进程的代码段;对于数据段,原则上需保持各自私有。然而,若父子进程仅读取而不修改某个全局变量(即该数据处于只读状态),则无需为双方创建独立的副本。具体实现机制后续详述。因此,Shell进程与通过命令行启动的用户程序(包括用户自定义程序)之间,构成父子进程关系。

二、获取环境变量

程序中获取环境变量
1. 使用命令行参数

其实在main函数中不止有两个参数,还有第三个参数用于配置环境变量,char *env[],同样他也是一个char*类型的指针数组。通过下面代码来做具体解释:

#include <stdio.h>
#include <unistd.h>int main(int argc, char *argv[], char *env[])
{for(int i = 0; env[i]; i++)//如果env[i]为0则后面没有数据了,这是系统规定,相当于字符串后面加上一个`\0`printf("env[%d]: %s\n", i, env[i]);return 0;
}

执行结果:

[lisihan@hcss-ecs-b735 lession13]$ make
gcc -o code code.c -std=c99
[lisihan@hcss-ecs-b735 lession13]$ ./code
env[0]: XDG_SESSION_ID=150
env[1]: HOSTNAME=hcss-ecs-b735
env[2]: TERM=xterm
env[3]: SHELL=/bin/bash
env[4]: HISTSIZE=10000
env[5]: SSH_CLIENT=218.77.77.250 39505 22
env[6]: SSH_TTY=/dev/pts/1
env[7]: USER=lisihan							#用户
env[8]: LD_LIBRARY_PATH=:/home/lisihan/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
env[9]:			LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:				#当前配色方案
env[10]: MAIL=/var/spool/mail/lisihan
env[11]: PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lisihan/.local/bin:/home/lisihan/bin
env[12]: PWD=/home/lisihan/lession13									#pwd,当前位置
env[13]: LANG=en_US.UTF-8
env[14]: HISTCONTROL=ignoredups
env[15]: SHLVL=1
env[16]: HOME=/home/lisihan
env[17]: LOGNAME=lisihan
env[18]: SSH_CONNECTION=218.77.77.250 39505 192.168.3.169 22
env[19]: LESSOPEN=||/usr/bin/lesspipe.sh %s
env[20]: XDG_RUNTIME_DIR=/run/user/1000
env[21]: HISTTIMEFORMAT=%F %T lisihan 
env[22]: _=./code
env[23]: OLDPWD=/home/lisihan

在这里插入图片描述

  • 每个程序都会收到⼀张环境表,环境表是⼀个字符指针数组,每个指针指向⼀个以’\0’结尾的环境字符串

  • 从结果中我们可以看出:打印出来的结果就是当前这个程序的换件变量配置,所有环境变量最终格式都是key = value的格式

  • 环境变量通常具有全局属性,可以被⼦进程继承下去 。在进程创建时,操作系统会将父进程的环境变量表副本传递给新进程。无论该进程作为子进程、兄弟进程或其他派生关系存在,每个进程均通过继承机制获取其父进程的环境变量表,并维护独立的实例。

2. 使用系统调用函数getenv("字符串");
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>int main()
{printf("USER: %s\n", getenv("USER"));printf("HOME: %s\n", getenv("HOME"));printf("PWD: %s\n", getenv("PWD"));printf("PATH: %s\n", getenv("PATH"));return 0;
}

运行结果:

[lisihan@hcss-ecs-b735 lession13]$ ./code1
USER: lisihan
HOME: /home/lisihan
PWD: /home/lisihan/lession13
PATH: /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lisihan/.local/bin:/home/lisihan/bin:/home/lisihan/lession13
3. 使用系统提供的全局变量environ

这是我们C语言提供的一个标准全局变量,也称为环境变量的前半部分。它是一个char类型的指针,因为环境变量表示字符数组,所以要指向环境变量的第一个元素,其类型必须是char* 。由于bash是用C语言编写的,它还会在内部维护一个char*类型的指针environ,该指针指向当前对应的环境变量表。因此,如果我们想获取环境变量,既不想通过getenv函数获取,也不想通过其他参数获取,系统中本来就存在environ变量,我们可以将其视为数组,并直接输出environ中对应的元素。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>extern char **environ;int main()
{for(int i = 0; environ[i]; i++)printf("%s\n", environ[i]);return 0;
}

运行结果:

[lisihan@hcss-ecs-b735 lession13]$ gcc -o code2 code2.c -std=c99
[lisihan@hcss-ecs-b735 lession13]$ ./code2
XDG_SESSION_ID=161
HOSTNAME=hcss-ecs-b735
TERM=xterm
SHELL=/bin/bash
#
#与前面是一样的,这里就不显示了
#
HOME=/home/lisihan
SHLVL=4
LOGNAME=lisihan
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/1000
HISTTIMEFORMAT=%F %T lisihan 
_=./code2
命令行中查询环境变量

环境变量不是凭空产生的,我们可以在命令行中用指令env查看当前位置的环境变量:

[lisihan@hcss-ecs-b735 lession13]$ env
XDG_SESSION_ID=150
HOSTNAME=hcss-ecs-b735
TERM=xterm
SHELL=/bin/bash
#
#与前面是一样的,这里就不显示了
#
LOGNAME=lisihan
SSH_CONNECTION=218.77.77.250 39505 192.168.3.169 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/1000
HISTTIMEFORMAT=%F %T lisihan 
_=/usr/bin/env
OLDPWD=/home/lisihan

需要注意的是:不同路径下环境变量其实是不一样的,我们从PWD中就可以看出

小细节:

使用su -切换为root用户之后,环境变量中的USER和LOGNAME会相应的变为root

[lisihan@hcss-ecs-b735 lession13]$ env
#有一些我删了,只保留有用的数据
USER=lisihan
MAIL=/var/spool/mail/lisihan
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lisihan/.local/bin:/home/lisihan/bin:/home/lisihan/lession13
PWD=/home/lisihan/lession13
HOME=/home/lisihan
LOGNAME=lisihan[lisihan@hcss-ecs-b735 lession13]$ su -
Password: 
Last login: Sat May 24 09:13:52 CST 2025 from 218.77.77.250 on pts/1
Last failed login: Fri May 30 14:28:53 CST 2025 from 14.103.117.98 on ssh:notty
There were 6266 failed login attempts since the last successful login.
[root@hcss-ecs-b735 ~]# env
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root

但是如果我们用su直接以root身份进行操作但不登录root,USER和LOGNAME不会变为root

[lisihan@hcss-ecs-b735 ~]$ env
USER=lisihan
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/home/lisihan
HOME=/home/lisihan
LOGNAME=lisihan
[lisihan@hcss-ecs-b735 ~]$ su
Password: 
[root@hcss-ecs-b735 lisihan]# env
USER=lisihan
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/home/lisihan
HOME=/root
LOGNAME=lisihan
[root@hcss-ecs-b735 lisihan]# cd ~
[root@hcss-ecs-b735 ~]# env
USER=lisihan
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=lisihan

三、常见环境变量

1. HOME
  • 在Linux系统中,环境变量HOME存储着当前用户的家目录路径,可通过echo $HOME命令查看其值。

  • HOME的作用:当使用su命令切换用户身份时(如切换至root用户),该变量值会动态更新为相应用户的家目录路径,因为不同用户拥有独立的家目录配置。关于登录初始化流程:用户认证成功后,系统会启动Shell进程(如Bash),该进程首先从配置文件中加载环境变量(包括HOME),随后依据HOME的值将进程的初始工作位置设定为家目录。这一顺序表明:环境变量的加载发生在工作目录设定之前,家目录位置本质上是由HOME变量所决定的。

  • 修改当前工作路径:==更改当前工作目录可通过Bash进程调用chdir系统函数实现,该操作会更新进程的工作位置。==由于Bash作为用户交互接口,其工作目录决定用户默认所处位置。需注意:所有命令行启动的进程均为Bash的子进程,在创建时会继承父进程的工作目录属性——这是通过复制PCB实现的。当在Bash中切换路径后,其工作目录更新,后续创建的子进程将继承此新路径

    穿插一个小知识点:

    登录时的默认家目录设定即基于此机制:Bash启动后首先读取HOME环境变量(该变量由系统根据用户名自动设置,如普通用户为/home/用户名,root用户为/root),再通过chdir切换至该路径。另存在PWD环境变量动态记录当前工作路径,其更新与目录切换同步,主要作用是向运行中的程序提供位置信息。程序可通过标准库函数(如getcwd)获取此值。

2. OLDPWD

你的Linux系统环境变量中有一个叫做oldpwd,它总会保存你最近一次所在的路径。所以cd内部只要识别到你的选项是,就会直接获取oldpwd,然后改变当前进程路径。这就是为什么它能来回跳转的原因,每个环境变量在系统层面上都有其各自的作用。

3. PATH

在之前提到过,Linux下一切皆文件,命令行中的各种命令其实就是各种可执行文件。但我们会发现,当我们使用Linux系统中自带的或yum install下载的各种程序命令的时候,我们不需要在前面加上文件路径,比如:./,但是当我们执行自己的可执行程序的时候,我们需要带有文件路径,比如./code。下面对此做出解释。

  • 执行系统命令无需路径前缀,而执行用户自定义程序需使用./显式指定当前目录路径,此差异源于可执行文件的搜索机制。进程创建需先定位可执行文件实体,系统命令如pwd位于预定义路径(如/usr/bin),而自定义程序code未在搜索路径内故需显式路径。

  • 其根本机制在于:Shell通过环境变量PATH定义的冒号分隔路径集合(如/usr/bin:/bin)进行文件搜索,当输入命令时,Shell依次遍历PATH中各路径直至定位可执行文件;若未命中则报错。自定义程序因当前目录(.)通常不在PATH中,故需./code显式指定。

  • 解决方案有二:1) 将程序复制至PATH包含路径(如/usr/bin);2) 将当前目录添加至PATH环境变量。

  • 如何修改PATH

    • 注意修改的时候不能直接用等号赋值,应该要在之前的$PATH 中的内容后面添加PATH=$PATH:<新路径>,注意不同的路径之间要用:分开
    • 目前继承的环境变量全都是内存级的,不用担心改错环境变量。因为只要关闭当前shell,重新登录,再形成新的shell,path就会自动恢复。
    • 环境变量的初始值源于系统配置文件,其加载机制遵循严格流程:用户登录时启动的Shell进程会解析/etc/profile及家目录下的**.bashrc.bash_profile**等配置文件,将其内容载入内存构建环境变量表。该表通过进程继承机制传递给所有派生进程(如命令行执行的程序)。环境变量的持久化修改需编辑对应配置文件,例如在.bash_profile中添加PATH=$PATH:/custom/path并执行source .bash_profile使变更生效。进程的用户标识(UID)同样继承自登录会话——系统通过PAM(Pluggable Authentication Modules)认证后,将用户凭证植入初始Shell的环境变量(如USER),后续进程据此继承身份属性。此机制确保文件权限校验时,进程UID能与文件UID进行所有权匹配。
[lisihan@hcss-ecs-b735 lession13]$ ls
code  code.c  Makefile
[lisihan@hcss-ecs-b735 lession13]$ pwd
/home/lisihan/lession13
[lisihan@hcss-ecs-b735 lession13]$ echo $PATH
-bash: /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lisihan/.local/bin:/home/lisihan/bin:
[lisihan@hcss-ecs-b735 lession13]$ PATH=$PATH:/home/lisihan/lession13
[lisihan@hcss-ecs-b735 lession13]$ echo $PATH
-bash: /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lisihan/.local/bin:/home/lisihan/bin:/home/lisihan/lession13: 
4. SHELL

SHELL : 当前Shell,它的值通常是/bin/bash

四、环境变量与本地变量

在shell命令行中我们可以执行类似代码一样的脚本语句,并且可以用echo $<变量>,来查看在命令行中定义的变量

[lisihan@hcss-ecs-b735 lession13]$ i=0; for((;i<10;i++)); do echo $i; done
0
1
2
3
4
5
6
7
8
9
[lisihan@hcss-ecs-b735 lession13]$ echo $i
10

i这类在shell命令行中定义的变量我们称之为本地变量。

小知识:

Bash进程具备语法解析能力,可识别whilefor等控制结构及变量定义操作。当输入此类指令时,Bash并非简单视作字符串,而是将其解析为程序逻辑并执行相应操作。基于此解释执行能力,通过编写包含变量、循环及命令序列的文本文件(即Shell脚本),由Bash逐行解释运行,实现自动化任务处理。这种将命令解释器扩展为脚本执行引擎的机制,与Python、PHP等解释型语言的工作原理具有本质一致性——均通过运行时环境动态解析并执行源码。

本地变量与环境变量的对比
  • 环境变量本质是操作系统维护的全局性键值对数据,其管理机制包含定义、验证与转换操作。在Shell中可通过VAR=value语法定义本地变量(如a=100),此类变量仅存在于当前Shell进程内部,不会被env命令显示,但可通过set命令查看所有变量(含环境变量与本地变量)。

  • 本地变量常用于Shell脚本控制(如循环计数)或界面配置(如PS1提示符格式)。在使用env命令时也不会显示出来,如果要显示当前所有的环境变量与本地变量,需要用一个新的命令set

    [lisihan@hcss-ecs-b735 lession13]$ 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]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
    BASH_VERSION='4.2.46(2)-release'
    COLUMNS=210
    DIRSTACK=()
    EUID=1000
    GROUPS=()
    HISTCONTROL=ignoredups
    HISTFILE=/home/lisihan/.bash_history
    HISTFILESIZE=10000
    HISTSIZE=10000
    HISTTIMEFORMAT='%F %T lisihan '
    HOME=/home/lisihan
    HOSTNAME=hcss-ecs-b735
    HOSTTYPE=x86_64
    ID=1000
    IFS=$' \t\n'
    LANG=en_US.UTF-8
    LD_LIBRARY_PATH=:/home/lisihan/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
    LESSOPEN='||/usr/bin/lesspipe.sh %s'
    LINES=43
    LOGNAME=lisihan
    LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
    MACHTYPE=x86_64-redhat-linux-gnu
    MAIL=/var/spool/mail/root
    MAILCHECK=60
    OLDPWD=/root
    OPTERR=1
    OPTIND=1
    OSTYPE=linux-gnu
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
    PIPESTATUS=([0]="0")
    PPID=27810
    PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    PS1='[\u@\h \W]\$ '		#本地变量明当前命令行的格式、用户主机名、当前工作路径和提示符
    PS2='> '				#本地变量
    PS4='+ '				#本地变量
    PWD=/home/lisihan/lession13
    SHELL=/bin/bash
    SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
    SHLVL=4
    TERM=xterm
    UID=1000
    USER=lisihan
    XDG_RUNTIME_DIR=/run/user/1000
    XDG_SESSION_ID=161
    _=10
    colors=/home/lisihan/.dircolors
    i=10			#这是我们之前定义的本地变量
    
  • 环境变量与本地变量的核心差异在于继承性:环境变量可通过进程派生机制传递给子进程,而本地变量仅限当前Shell进程访问。为验证此特性,设计程序通过getenv("IS_RUNNING")检测特定环境变量:若变量不存在则启动程序并标记运行状态;若存在则阻止重复启动。实验表明,当IS_RUNNING作为本地变量时(通过VAR=value设置),子进程无法检测到该变量;但使用export命令将其转为环境变量后,子进程即可继承该变量并实现单实例控制。此过程同时揭示环境变量的动态管理机制:通过unset命令可移除指定环境变量,使程序恢复可启动状态。

本地变量修改为环境变量

若需将本地变量提升为全局环境变量,需使用export命令(如export a),该操作实质是将变量从Shell的本地变量表迁移至环境变量表。环境变量表在进程创建时被子进程继承,而本地变量表仅限当前Shell访问。当执行echo $a时,Shell优先检索本地变量表,未命中时再查询环境变量表。

五、总结

http://www.xdnf.cn/news/726823.html

相关文章:

  • KVM 安装 Ubuntu 22
  • 编码总结如下
  • 变焦位移计:机器视觉如何克服人工疲劳与主观影响?精准对结构安全实时监测
  • Wireshark 在 macOS 上使用及问题解决
  • 4.2.3 Spark SQL 手动指定数据源
  • 组件化开发:构建可复用的DeepSeek小程序组件
  • 多方法解决MNIST数字识别
  • LangChain【3】之进阶内容
  • AU6825集成音频DSP的2x32W数字型ClaSSD音频功率放大器(替代TAS5825)
  • Vad-R1:通过从感知到认知的思维链进行视频异常推理
  • 力扣刷题Day 65:单词搜索(79)
  • 吴恩达MCP课程(1):chat_bot
  • WordPress SureTriggers插件认证绕过漏洞(CVE-2025-3102)
  • springboot文件上传下载
  • 《系统集成项目管理工程师(第三版)》高效学习方法
  • leetcode108.将有序数组转换为二叉搜索树:递归切分中点构建平衡树的智慧
  • 传输层核心技术解析
  • HAProxy 可观测性最佳实践
  • 数据库查询性能优化:深入理解与应用物化视图
  • 设计学生管理系统的数据库
  • PostIn V1.1.2版本发布,新增接口评审功能,提升接口质量与合理性
  • 2025陕西省赛补题
  • Golang持续集成与自动化测试和部署
  • Go语言接口:灵活多态的核心机制
  • 马尔可夫链模型解析—24小时政策过山车,黄金拉升80美元V型反转路径
  • 前端antd,后端fastapi,解决文件上传
  • 【二维数组】
  • 【航天远景 MapMatrix 精品教程】08 Pix4d空三成果导入MapMatrix
  • Ubuntu 下同名文件替换后编译链接到旧内容的现象分析
  • Java String的使用续 -- StringBuilder类和StringBuffer