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

Linux学习记录——십일 环境变量

文章目录

  • 1、认识
  • 2、通过代码获取环境变量
    • 1、手动获取
    • 2、函数获取
  • 3、重新认识环境变量


1、认识

在云服务器上写程序时,最终的执行需要./文件名,点表示当前目录,/是文件分隔符,之后就会打印程序,这是用户的操作;而系统则不必这样做,这是因为系统有环境变量的支持。环境变量中有个常见的PATH,查看环境变量用这个指令echo $。执行就会出现一个路径,也就是PATH的路径,我们写的程序由于不在这个路径里,自然也就无法自动执行,所以需要用户自己指定路径。而系统命令,比如ls,用which ls查看路径,发现它的路径可以在PATH的路径里找到,所有调用ls时不需要指定路径。

要在PATH里添加自己的路径的话,命令:export PATH=$PATH:路径。这样可以不改变原有路径而添加新路径。当然也可以用cp -rf 文件名 /usr/bin指令把路径拷贝过去,也可以在系统目录里查看到。

实际上像这样把可执行程序拷贝到系统默认路径下就相当于Linux的软件安装。而卸载,rm /usr/bin/文件名 -rf,就是删除路径。

通过以上例子,可以这样理解环境变量:它是由系统维护的,在特殊场景的变量。环境变量可以帮助编译器编译用户写的代码。

常见的环境变量:

PATH:指定命令的搜索路径
HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL:当前Shell,它的值通常是/bin/bash。

想查看某一个环境变量的话, echo $环境变量名 ,查看系统环境变量的话,env即可。

很多系统展现出来的规定都是依靠环境变量去实现的。

和环境变量相关的命令:
1、echo: 显示某个环境变量值
2.export : 设置一个新的环境变量
3、env:显示所有环境变量
4、unset:清除环境变量
5、set:显示本地定义的shell变量和环境变量

2、通过代码获取环境变量

1、手动获取

int main(int argc, char* argv[], char* envvp[])
{//envp就是环境变量的指针数组,每一个指向一个字符串,最后一个指向字符串的指针的下一项会指向NULLfor(int i = 0; envo[i]; i++){printf("envp[%d]->%s\n", i, envp[i]);}return 0;
}

通过这个程序打印出来的就是传递给当前进程的环境变量表。每个字符串就是环境变量字符串。

假如不传参,我们也可以拿到环境变量。environ是一个全局变量,char**类型,相当于char* []。

int main()
{  extern char** environ;for(int i = 0; environ[i]; i++){printf("environ[%d]->%s\n", i, environ[i]);}return 0;
}

2、函数获取

但环境变量不需要用户自己去遍历。使用特定的函数可以获取。getenv函数,可根据变量名获取变量。这个需要头文件<stdlib.h>。

int main()
{char* user = getenv("USER");if(user == NULL) perror("getenv");else printf("USER: %s\n", user);return 0;
}

把user换成pwd,pwd这个指令也就写好了,如果把当前目录放到根目录下,export PATH=$PATH:路径,那么pwd和自己写的pwd查看到的都只有一个/。

如果想让写的这个程序只有自己可以执行:

#define NAME "zyd"
int main()
{char* own = getenv("USER");if(strcmp(own, NAME) == 0){printf("程序正常执行");}else{printf("当前用户%s非本人,不能运行\n", own);}return 0;
}

3、重新认识环境变量

环境变量本质上是一个内存级的一张表,这张表由用户在登陆系统的时候,进行给特定用户形成属于自己的环境变量表。每一个环境变量都有自己的应用场景。每一个元素都是kv的。

我们手动改环境变量时,再次运用变量会被改变,而重启一下就恢复正常了。环境变量再没有存入数据的时候,它放在系统的配置文件。在根目录下,ls -al,看到.bash_profile和.bashrc,这两个文件就是shell脚本,里面存放配置文件。

环境变量是在哪里建立的?启动Xshell后,内存会开一个Xshell进程,这个进程会读取命令和命令行,并且加载进环境变量这个表;当我们export一行代码后,比如a=‘!!!’,系统就会把它读成一个字符串"a=‘!!!’",并且由表中空着的指针去指向这个字符串,再重新设定NULL, 当然空间不够就扩容。而创建子进程后,作为父进程,环境变量就会被传到子进程里。环境变量是由bash整理的。

在程序文件里,可以写printf(“myenv: %s\n”, getenv(“a”)); 运行成功后,我们就可以看到自己搞的这个变量。

改环境变量用export是因为这样才可以继承到子进程,如果不加export,也可以写成功,但这将会是shell的本地变量,只在shell内部有效,我们写一个程序文件去调用它无法调用,这样的解决办法就是export 变量名就可,因为它已经被建立了,这时候export就是把本地变量添加到表里了。

之后的博客中还会深入一下环境变量。但这篇也基本全了。

结束。

http://www.lryc.cn/news/25592.html

相关文章:

  • 【人工智能 Open AI 】我们程序员真的要下岗了- 全能写Go / C / Java / C++ / Python / JS 人工智能机器人
  • STM32 EXTI外部中断
  • Mapper代理开发——书接MaBatis的简单使用
  • 实体对象说明
  • JAVA中加密与解密
  • 改进YOLO系列 | ICLR2022 | OMNI-DIMENSIONAL DYNAMIC CONVOLUTION: 全维动态卷积
  • 信息收集之Github搜索语法
  • 【案例教程】拉格朗日粒子扩散模式FLEXPART
  • 试题 算法训练 自行车停放
  • 泛型与Map接口
  • Unity Bug记录本
  • B. The Number of Products)厉害
  • 一起Talk Android吧(第五百一十二回:自定义Dialog)
  • GinVueAdmin源码分析3-整合MySQL
  • 大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——MapReduce开发总结
  • requests---(4)发送post请求完成登录
  • Python抓取数据具体流程
  • 【Python学习笔记】第二十四节 Python 正则表达式
  • 数字逻辑基础:原码、反码、补码
  • 有限差分法-差商公式及其Matlab实现
  • 高校就业信息管理系统
  • 【Java|golang】2373. 矩阵中的局部最大值
  • 根据指定函数对DataFrame中各元素进行计算
  • 【蓝桥杯集训·每日一题】AcWing 3502. 不同路径数
  • Java - 数据结构,二叉树
  • 模拟QQ登录-课后程序(JAVA基础案例教程-黑马程序员编著-第十一章-课后作业)
  • 【壹】嵌入式系统硬件基础
  • 当参数调优无法解决kafka消息积压时可以这么做
  • Java线程池源码分析
  • 手撕八大排序(下)