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

unix C之环境变量

什么是环境变量

每个进程都有自己的一张环境变量表,表中的每个条目都是形如 key=value 的键值对形式的环境变量。

进程可以通过环境变量访问计算机资源。

在终端下输入env命令,可以查看环境变量列表。

通过echo $name 可以查看某个环境变量的值。

环境变量的类型

概述

环境变量分为:

  • 全局环境变量:当前shell和其子进程都是可见的
  • 局部环境变量:只有当前shell可见

将局部变量设置成环境变量:

export name

删除环境变量:

unset name

简单示例

设置局部环境变量:

A=B

查看局部环境变量:

echo $A

将局部变量设置为环境变量:

export A

查找全局环境变量:

env | grep A=

删除环境变量:

unset A

常用环境变量 PATH

概述

PATH:存储了执行命令时,系统中查询命令的路径。

临时修改PATH

临时将指定路径添加到PATH中。

PATH=$PATH:/home/zhangdapeng/bin

查看修改之后的环境变量:

echo $PATH

永久修改PATH

持久的配置PATH:

vim ~/.bashrc

追加环境变量的配置:

PATH=$PATH:/home/zhangdapeng/bin

激活环境变量:

source ~/.bashrc

常用环境变量 PS1

概述

PS1:用来影响提示符的内容。

查看 PS1

echo $PS1# 输出
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

修改 PS1

PS1='\W\$'

环境变量表

概述

所谓环境变量表就是一个以NULL指针结束的字符指针数组。

其中每个元素都是一个字符指针,指向一个以空字符串结尾的字符串,该字符串就是形如 key=value 键值对形式的环境变量。

该指针数组的地址保存在全局变量environ中。

本质

environ本身是一个二级指针,其中每个元素是个一级指针,存储的时候字符串的首地址。

基础示例

示例代码:查看进程中环境变量中所有的值。

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

输出结果:

SHELL=/bin/bash
WSL2_GUI_APPS_ENABLED=1
WSL_DISTRO_NAME=Ubuntu-22.04
NAME=pc
PWD=/home/zhangdapeng/code/helloc
LOGNAME=zhangdapeng
MOTD_SHOWN=update-motd
HOME=/home/zhangdapeng
LANG=C.UTF-8
WSL_INTEROP=/run/WSL/378_interop
...
WAYLAND_DISPLAY=wayland-0
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=zhangdapeng
DISPLAY=:0
SHLVL=1
XDG_RUNTIME_DIR=/run/user/1000/
...
HOSTTYPE=x86_64
PULSE_SERVER=unix:/mnt/wslg/PulseServer
_=./test
OLDPWD=/home/zhangdapeng/code

main函数第三个参数

概述

main函数实际上有三个参数,其中第三个参数存储的也是环境变量表的起始地址。

基础示例

示例代码:通过main函数的第三个参数查看环境变量表

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

输出结果:

  • 从第一行输出结果我们可以看到,全局变量environ和main函数第三个参数envp指向的内存地址是一样的
  • 通过envp也可以取出每个环境变量
0x7ffe553d7258, 0x7ffe553d7258SHELL=/bin/bash
WSL2_GUI_APPS_ENABLED=1
WSL_DISTRO_NAME=Ubuntu-22.04
NAME=pc
PWD=/home/zhangdapeng/code/helloc
LOGNAME=zhangdapeng
MOTD_SHOWN=update-motd
HOME=/home/zhangdapeng
LANG=C.UTF-8
WSL_INTEROP=/run/WSL/378_interop
...
WAYLAND_DISPLAY=wayland-0
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=zhangdapeng
DISPLAY=:0
SHLVL=1
XDG_RUNTIME_DIR=/run/user/1000/
WSLENV=
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
...
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
HOSTTYPE=x86_64
PULSE_SERVER=unix:/mnt/wslg/PulseServer
_=./test
OLDPWD=/home/zhangdapeng/code
http://www.lryc.cn/news/345827.html

相关文章:

  • Flutter实战记录-协作开发遇到的问题
  • Linux 安装JDK和Idea
  • c#绘制渐变色的Led
  • LifeCycle之ProcessLifeCycleOwner
  • C++ | Leetcode C++题解之第79题单词搜索
  • 如何通过PHP语言实现远程控制空调
  • 【AI+换脸换装】从OpenAI 探索色情露骨内容领域浅聊AI换脸换装
  • Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗
  • RobbitMQ基本消息队列的消息发送过程
  • MongoDB聚合运算符:$topN
  • 什么是顶级域名、二级域名、三级域名?
  • [Android]四大组件简介
  • 一次完整的GC流程
  • GAME101-Lecture06学习
  • 202203青少年软件编程(Python)等级考试试卷(二级)
  • 带有-i选项的sed命令在Linux上执行成功,但在MacOS上失败了
  • [Linux_IMX6ULL驱动开发]-GPIO子系统和Pinctrl子系统
  • Elasticsearch:理解人工智能相似性搜索
  • Mac YOLO V9推理测试(基于ultralytics)
  • OuterClass.this cannot be referenced from a static context
  • CAP与BASE分布式理论
  • JavaScript性能优化策略
  • curl访问流式非流式大模型openai api接口
  • Go 使用 MongoDB
  • 什么是g++-arm-linux-gnueabihf
  • Unity延时触发的几种常规方法
  • CSS文字描边,文字间隔,div自定义形状切割
  • XWiki 服务没有正确部署在tomcat中,如何尝试手动重新部署?
  • 【退役之重学Java】关于 Redis
  • DateKit