个人主页:chian-ocean
文章专栏-Linux# 前言:
在 Linux 系统中,环境变量是存储系统和用户配置信息的重要机制。它们在 shell 和应用程序之间提供了一种灵活的配置方式。
什么是环境变量?
环境变量是一个键值对的形式,用于存储影响系统行为的信息。例如:
- 系统信息:如当前用户、主机名等。
- 配置路径:如程序搜索路径、库文件路径。
- 运行参数:如语言设置、日志级别等。
下面是常见的环境变量
程序搜索路径
含义:
- 每个目录之间用
:
分隔。 - 系统会依次在这些目录中搜索可执行程序文件。
bash
#程序所搜路径
echo $PATH
假设执行命令 g++
,系统的搜索过程如下:
- 从
PATH
列出的第一个目录开始搜索。 - 依次查找每个目录,直到找到
g++
这个可执行文件。 - 如果找到,执行该程序;如果找不到,返回"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(参数个数) 上述为4argv
通常是指 argument vector (参数向量)分别为./myproc
-a
-b
-c
环境变量表
环境变量表是操作系统为程序运行提供的一组动态键值对,用于存储系统信息、用户信息或应用程序配置信息。环境变量表通常包含系统级和用户级的信息,这些信息对所有进程或特定进程是全局可见的,且可以通过操作系统或程序进行读取和修改。
- 在通常的额C/C++代码中
mian
函数中的参数列表不仅仅argc
和argv
还存在一个环境变量表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
指定语言环境。 - 进程间共享信息:父进程可以通过环境变量向子进程传递信息。
- 系统配置:许多应用程序依赖环境变量来定位依赖文件、设置参数等。
- 控制进程的行为 :例如,通过
查看环境变量(两种)
- 通过:指令
bash
echo $name
- 通过:库函数
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
的环境变量存在。 -
应证了本地变量不可继承进程。