Linux环境变量:系统的隐形纽带

个人主页:chian-ocean

文章专栏-Linux# 前言:

在 Linux 系统中,环境变量是存储系统和用户配置信息的重要机制。它们在 shell 和应用程序之间提供了一种灵活的配置方式。

什么是环境变量?

环境变量是一个键值对的形式,用于存储影响系统行为的信息。例如:

  • 系统信息:如当前用户、主机名等。
  • 配置路径:如程序搜索路径、库文件路径。
  • 运行参数:如语言设置、日志级别等。

下面是常见的环境变量

程序搜索路径

含义
  • 每个目录之间用 : 分隔。
  • 系统会依次在这些目录中搜索可执行程序文件。
bash 复制代码
#程序所搜路径
echo  $PATH

假设执行命令 g++,系统的搜索过程如下:

  1. PATH 列出的第一个目录开始搜索。
  2. 依次查找每个目录,直到找到 g++ 这个可执行文件。
  3. 如果找到,执行该程序;如果找不到,返回"command not found"错误。

显示本机用户

bash 复制代码
#两种方法
#方法一
ehco #UESR
#方法二
whoami

二者内容相同但是又有一定的区别

比较项 whoami echo $USER
来源 查询系统当前有效用户 ID 读取 $USER 环境变量
可靠性 更可靠,反映当前用户身份 可能不准确(受环境变量影响)
切换用户后 正确显示当前实际用户 可能显示原始用户
常见用法 确认当前有效用户 显示登录时的用户名

env

在 Linux 中,env 是一个常用命令,用于显示当前用户的环境变量,也可以在特定环境中运行程序或命令

执行结果:

解释:

bash 复制代码
# XDG_SESSION_ID:当前用户会话的唯一标识符,由系统自动分配。
XDG_SESSION_ID=898

# HOSTNAME:当前主机的名称。
HOSTNAME=hcss-ecs-ad93

# SHELL:当前用户默认使用的 Shell 环境。
SHELL=/bin/bash

# TERM:终端类型,xterm 表示终端仿真器。
TERM=xterm

# HISTSIZE:保存的历史命令条数上限。
HISTSIZE=10000

# SSH_CLIENT:SSH 客户端的连接信息(IP、端口)。
SSH_CLIENT=111.33.8.92 54805 22

# SSH_TTY:当前 SSH 连接的虚拟终端设备。
SSH_TTY=/dev/pts/2

# USER:当前用户的用户名。
USER=ocean

# LS_COLORS:设置 `ls` 命令的输出颜色,用于区分不同文件类型。
LS_COLORS=rs=0:di=01;34:ln=01;36:...

# PATH:系统可执行程序的搜索路径。
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ocean/.local/bin:/home/ocean/bin

# MAIL:当前用户的邮件存放路径。
MAIL=/var/spool/mail/ocean

# PWD:当前工作目录(Present Working Directory)。
PWD=/home/ocean/linux/myproc

# LANG:系统语言环境设置,en_US.UTF-8 表示英语(美国)UTF-8 编码。
LANG=en_US.UTF-8

# HISTCONTROL:历史命令的控制规则,ignoredups 表示忽略重复的连续命令。
HISTCONTROL=ignoredups

# HOME:当前用户的家目录。
HOME=/root

# SHLVL:Shell 层级,表示当前 Shell 嵌套的深度。
SHLVL=2

# LOGNAME:当前登录的用户名。
LOGNAME=ocean

# SSH_CONNECTION:SSH 连接的详细信息,包括源 IP 和目标 IP。
SSH_CONNECTION=111.33.8.92 54805 192.168.13.203 22

# LESSOPEN:为 `less` 命令设置预处理程序,用于显示压缩文件等内容。
LESSOPEN=||/usr/bin/lesspipe.sh %s

# XDG_RUNTIME_DIR:运行时用户特定的临时目录。
XDG_RUNTIME_DIR=/run/user/1000

# HISTTIMEFORMAT:历史命令的时间显示格式。
HISTTIMEFORMAT=%F %T root 

# _:记录上一次执行的命令路径。
_=/usr/bin/env

# OLDPWD:上一次所在的目录。
OLDPWD=/

理解参数参数表

命令行参数表

命令行参数是用户在命令行中执行程序时传递给程序的额外信息,用于控制程序的行为或向程序提供所需的数据。程序可以根据这些参数完成不同的功能或任务。

bash 复制代码
程序名 [选项] [参数]
ls -l -a  /home/ocean

# -l  -a 是选项,表示显示文件的详细信息。
# /home/ocean 是参数,指定要列出文件的目录路径。

程序名:需要运行的命令或可执行程序。

选项 :通常以 --- 开头,用于控制命令的行为。

参数:用于提供额外数据,如文件路径、数值等。

demo

cpp 复制代码
#include<iostream>
using namespace std;

int main(int argc, char *argv[]) 
{
    printf("参数个数: %d\n", argc);
    for (int i = 0; i < argc; i++) 
    {
        printf("参数 %d: %s\n", i, argv[i]);
    }
    return 0;
}

执行代码:

bash 复制代码
./myproc -a -b -c
  • argc通常指的是 argument count(参数个数) 上述为4
  • argv 通常是指 argument vector (参数向量)分别为./myproc -a -b -c

环境变量表

环境变量表是操作系统为程序运行提供的一组动态键值对,用于存储系统信息、用户信息或应用程序配置信息。环境变量表通常包含系统级和用户级的信息,这些信息对所有进程或特定进程是全局可见的,且可以通过操作系统或程序进行读取和修改。

  • 在通常的额C/C++代码中mian函数中的参数列表不仅仅argcargv还存在一个环境变量表env

demo:

cpp 复制代码
int main(int argc, char *argv[],char *env[]) 
{
  
      int i = 0;    
      for( ;env[i];i++ )    
      {
          cout<<env[i]<<endl;    
      } 
   return 0; 
}
  • 执行的结果是和env的指令是一样的的。

**小结:**在C/C++代码执行的时候,OS会给我们准备两张表格。

  • 命令行参数表
  • 环境变量表

环境变量

环境变量 (Environment Variables)是 Linux 系统中用于存储系统配置信息用户会话信息的变量。它们通过动态键值对的形式,为 Shell 和程序提供配置信息,影响程序运行的行为。

环境变量的定义和作用

  • 环境变量 是一种以键值对(key-value)形式存在的全局变量,用于配置和存储系统运行环境信息。
    例如:PATH, HOME, USER, LANG 等。
  • 它们的作用:
    • 控制进程的行为 :例如,通过 PATH 指定命令的查找路径,通过 LANG 指定语言环境。
    • 进程间共享信息:父进程可以通过环境变量向子进程传递信息。
    • 系统配置:许多应用程序依赖环境变量来定位依赖文件、设置参数等。

查看环境变量(两种)

  1. 通过:指令
bash 复制代码
echo $name
  1. 通过:库函数
bash 复制代码
getenv("name")

由于环境变量得存在我们可以执行不同得代码,示例如下:

cpp 复制代码
#include<iostream>    
#include <sys/types.h>    
#include <unistd.h>    
#include<string>                                                                                                           
#include<stdlib.h>    
using namespace std;    
    
int main()    
{    
    string who(getenv("USER"));    
    cout<<"who: "<<getenv("USER")<<endl;    
    
    if(who == "root")    
    {    
        cout<<"我是root用户"<<endl;    
    }    
    else    
    {    
        cout<<"我是ocean用户"<<endl;    
    }    
    return 0;    
}  

使用不同用户执行代码:

  • 分别用普通用户和root用户执行同一个代码
  • 通过环境变量得判断、得到了不同得结果,可以判断是否拥有权限。

设置环境变量

先观察一个现象:指令和可执行程序在执行的时候,一个直接输入,另外一个需要./name

指令和可执行程序

执行指令的时候是不需要添加./的,但是执行一个可执行程序的时候就需要添加./

  • 指令的执行OS会在默认路径中查找,但是可执程序不会。

当我们将这个程序的路径添加到环境变量的路径执之中的时候,就可以跟指令一样执行代码了。

bash 复制代码
PATH=$PATH:路径
  • 这样我们的默认路径就在默认路径环境变量的里面了

临时设置环境变量

在终端中使用 export 命令:

bash 复制代码
export val="123"
bash 复制代码
env # 查看环境变量
  • 会发现里面多了一个环境变量val

临时取消环境变量

使用 unset 命令:

bash 复制代码
unset name
  • 该命令仅对当前终端会话生效。

本地变量和环境

  • 本地变量

    本地变量是在某个程序或脚本的局部作用域中定义的变量,它只能在定义它的代码块或函数中使用,超出作用域后就会被释放。

  • 环境变量

    环境变量是在操作系统中全局可见的变量,它们存储在系统内存中,可以在不同进程、程序或脚本之间共享和传递。

本地变量环境变量 是编程和操作系统中常见的两种变量类型,它们在作用域、存储位置和用途上存在显著区别。


定义
  • 本地变量
    本地变量是在某个程序或脚本的局部作用域中定义的变量,它只能在定义它的代码块或函数中使用,超出作用域后就会被释放。
  • 环境变量
    环境变量是在操作系统中全局可见的变量,它们存储在系统内存中,可以在不同进程、程序或脚本之间共享和传递。
区别
对比点 本地变量 环境变量
定义 局部定义,仅限当前作用域 系统定义或全局可访问
作用域 局限于代码块或函数 全局作用于当前会话或系统
生命周期 随代码块或函数执行结束而消失 可以是临时的或持久的
存储位置 程序的内存栈或堆内存中 操作系统的环境空间中
共享性 不能跨程序或子进程共享 可以在父进程和子进程中共享
使用场景 局部逻辑和临时数据 系统参数配置、跨程序数据共享

demo:

bash 复制代码
val="hello world" #添加本地变量
set | grep val    #查找本地变量
val='hello world' 
cpp 复制代码
#include<iostream>    
#include <sys/types.h>    
#include <unistd.h>    
#include<string>     
using namespace std;
int main(int argc, char *argv[],char *env[])
{
  	cout<<getenv("val")<<endl;
    return 0;
}
  • 执行代码但是显示任何结果,但是本地变量还在
bash 复制代码
#现在导入为环境变量
export val
  • 现在显示val的环境变量存在。

iostream>

#include <sys/types.h>

#include <unistd.h>

#include

using namespace std;

int main(int argc, char *argv[],char *env[])

{

cout<<getenv("val")<<endl;

return 0;

}

* 执行代码但是显示任何结果,但是本地变量还在

[外链图片转存中...(img-U1nCsTPC-1735650120273)]

~~~bash
#现在导入为环境变量
export val

[外链图片转存中...(img-jXnyOSRd-1735650120274)]

  • 现在显示val的环境变量存在。

  • 应证了本地变量不可继承进程。

相关推荐
木颤简叶2 小时前
Linux命令——4.重定向、管道
linux
猫一样的妩媚3 小时前
C与语言GDB调试
linux·c语言
运维搬运工5 小时前
nginx
运维·nginx
ChineHe5 小时前
nginx基础篇 - 入门介绍与安装教程
运维·nginx
小米先森6 小时前
04 文件IO
linux
小白爱电脑7 小时前
光纤收发器技术参数详解
运维·网络·光纤收发
桃园码工7 小时前
11-Gin 中的 Cookie --[Gin 框架入门精讲与实战案例]
运维·服务器·gin·实战案例·入门精讲
优雅孤狼8 小时前
Ansible Jinja2 语法简介及使用
运维·ansible
summersneverdie8 小时前
Ubuntu执行sudo apt-get update失败的解决方法
linux·ubuntu