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

环境变量概念以及获取环境变量(linux下解析)

目录

1 基本概念

 2 常见的环境变量

 3 查看环境变量方法

4 和环境变量相关的命令

5 环境变量的组织方式

6 通过代码如何获取环境变量

6.1 命令行参数

 6.2 环境变量

7 通过系统调用获取或设置环境变量


1 基本概念

环境变量(environmentvariables)⼀般是指在操作系统中用来指定操作系统运行环境的⼀些参数。

 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

 2 常见的环境变量

这里首先给出一个命令用来查看环境变量:env。

环境变量:

例如: 

PATH:指定命令的搜索路径(如:输入的' ls' 'cp' 'mv' 直接执行,但是我们自己写的可执行程序需要 ' ./test ' 这样才能执行,而不能 'test' 这样执行,就是通过PATH路径去找到这些命令)

 HOME:指定用户的主工作⽬录(即用户登陆到Linux系统中时,默认的目录)

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

 3 查看环境变量方法

上述env命令,是查看所有环境变量的,这里提供一个通过环境名称,查找环境变量:

echo $NAME //NAME:你的环境变量名称

例如: 

 

4 和环境变量相关的命令

echo显示某个环境变量值
export设置一个新的环境变量
evn显示所有的环境变量
unset清除环境变量
set显示本地定义的shell变量和环境变量

export建立一个环境变量,再通过unset清除: 

 通过set建立的变量,不会加入环境变量,通过evn是查不出来的:

5 环境变量的组织方式

 

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

6 通过代码如何获取环境变量

6.1 命令行参数

这里首先抛出一个问题:在写C/C++语言代码时,int main()主函数大多都是这样写的,但是也有这种形式:

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

 例如:

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

结果:

可以看到这里的argc是表示命令行参数的个数,而argv则表示命令行参数对应的字符串。这也就是之前的‘ ls -a ’ ‘mv -r’ ‘ cp -r ’等命令就是通过这样的方式将命令传入到主函数执行的。

 6.2 环境变量

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

其实main函数还有第三个参数,就是env(环境变量)一个指针数组,可以通过上述方式获取,这也就是当我们执行一个子进程时,父进程会生成这个env,子进程也就可以找到这个环境变量。

 还有一种获取环境变量的方法:

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

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。

7 通过系统调用获取或设置环境变量

例如:

 #include <stdio.h>#include <stdlib.h>int main(){printf("%s\n", getenv("PATH"));return 0;}

通过getenv系统调用,传入环境变量的名称(如:PATH)就可以返回对应的环境变量。

(补充:环境变量是可以被子进程继承下去的,环境变量是通过/.bash_profile&&~/.bashrc这两个shell脚本文件在打开操作系统时就会自动生成环境变量)。

相关文章:

  • C#Winform程序将子窗体嵌入容器方法
  • 15、nRF52xx蓝牙学习(串口输入与回环)
  • code review时线程池的使用
  • Oracle数据库数据编程SQL<00. 课外关注:rownum、rowid、level、row_number 对比详解与实战>
  • Mac关闭sip方法
  • MySQL-运维篇
  • OpenCV核心模块中的矩阵操作
  • 10【模块学习】LCD1602(二):6路温度显示+实时时钟
  • pytorch实现逻辑回归
  • 提高RS-485总线稳定性办法
  • 黑马商城项目(一)MybatisPlus
  • 基于PySide6的YOLOv8/11目标检测GUI界面——智能安全帽检测系统
  • ScrollView(滚动视图)详解和按钮点击事件
  • 【Leetcode-Hot100】最小覆盖子串
  • 【链表】链表类型题目常用技巧及例题
  • Resilience4j与Spring Cloud Gateway整合指南:构建弹性的API网关
  • Stable Diffusion 图像生成 GUI 应用:图像缩放等五个优化——SD界面学习记录
  • yml文件上传并映射到实体类
  • Service生命周期
  • 微图4在《宁夏清水湾小流域治理》工程项目中的应用案例
  • “仅退款”将成过去时!多个电商平台集体修改售后规则,商家获得更多自主权
  • 对话|四代中国缘的麦肯锡前高管:在混乱中制定规则,而不是复制旧秩序
  • 大理杨徐邱上诉案开庭:当事人称曾接受过两次测谎测试
  • 教育部增设29种本科新专业,首建战略急需专业超常设置机制
  • 水利部启动干旱防御Ⅳ级响应,指导广西陕西抗旱保供保灌
  • 体坛联播|利兹联、伯恩利重返英超,北京淘汰北控队晋级四强