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

Linux操作系统学习---初识环境变量

目录

 ​编辑

环境变量的概念:

  小插曲:main函数的第一、二个参数

获取环境变量信息:

  1.main函数的第三个参数

  2.查看单个环境变量

  3.c语言库函数getenv()

  和环境变量相关的操作指令:

  1.export---导出环境变量:

  2.unset---清除环境变量:

  3.env指令

   4.set---显示所有环境变量和本地变量:

环境变量的特性:

  1.可以被子进程继承的全局性:

  2.由bash引入

结尾;


环境变量的概念:

  环境变量的基本格式是 "内容"="内容",中间不能用空格分开。粗略一点来说,他是程序执行时所依赖文件的路径。

  先思考一个问题:为啥我们在运行代码时非得像下面这样加上 ./ ,而执行系统的指令又不用呢(如下图)?这就和今天的环境变量有关了。

  小插曲:main函数的第一、二个参数

  main函数实际可以有三个参数,这里先介绍两个,一个是整形;另一个是字符指针数组(形参名称具体是啥不重要哈),第二个参数也叫命令行参数。

  下面通过例子来帮助理解:main函数的第一个整形参数代码接收指令的个数,第二个字符指针数组参数存放每个指令字符串的首地址。

  可以看到运行 用./code执行这个可执行程序时我象征性的带了四个选项,都被这两个参数记录下来了。由于Linux下的指令大多也是用c语言实现,因此使用的系统指令时可以带各种选项就是通过这个原理来实现的。

  当然这里也有蹊跷,我们自己的程序要加上 ./来指定当前路径运行,而系统的指令(如ls、pwd)等等就不用,这就和环境变量有关。

获取环境变量信息:

  1.main函数的第三个参数

   这里我们补充main函数的第三个参数,它和第二个参数一样也是字符指针数组,不同的是它存放各个环境变量字符串的首地址。

  下面的程序打印出的arr数组的内容很多,都是和刚才的env指令显示一样的环境变量。

  2.查看单个环境变量

  刚才都是一次性显示所有的环境变量,这次咱挑其中一个瞧瞧----它就是环境变量PATH,可以以下方式查看它的内容:

  不难看出就是一堆不同的路径,用 : 来分隔。其实我们在执行一个指令时,命令行解释器bash就会默认到这里面去寻找对应的文件并执行其中的内容,系统级的指令(如ls)就在这些路径中的一个里,而我们自己写的程序则没有,就需要使用 ./ 来告诉bash在当前目录下执行。

  3.c语言库函数getenv()

  c语言<stdlib,h>头文件里有一个getenv函数,原型如下,它接受环境变量名称,返回环境变量内容。

  和环境变量相关的操作指令:

  1.export---导出环境变量:

   格式如下,这样可以自己手动添加环境变量。

  2.unset---清除环境变量:

  格式如下,这样可以删除环境变量。

  

  3.env指令

  运行env后可以看到环境变量的内容还蛮多的,在这里就不展示了,有些一看就知道是啥,有的需要着重了解,可以解开一些之前学习时的疑惑。

   4.set---显示所有环境变量和本地变量:

    set指令相较于env更近一层,不仅显示显示环境变量,还显示本地变量()。

环境变量的特性:

  1.可以被子进程继承的全局性:

  由于子进程创建时会和父进程公用一份代码和数据,所以自然而然环境变量也是共同使用的。下面通过在代码中创建子进程来验证

从上面的代码执行结果可以看到父进程先打印了环境变量(有时候子进程先打印),随后进程进行打印,二者打印的内容相同。

  2.由bash引入

  如果使用上面提到的export向系统里添加自己的环境变量或者删除系统本身的环境变量,接着退出系统后重新进入,就会惊奇的发现环境变量貌似自动初始化了。

  上述情况的发生是因为环境变量是存储在操作系统中的,在打开一个新终端时,bash进程创建,从系统的配置文件里读取环境变量,相当于我们正常情况下访问到的环境变量只是一份拷贝,当退出终端后这种文件就会销毁,下一次登陆时又是新的bash进程从配置文件里读取未改变的环境变量。

结尾;

  通过上面的认知,咱就可以明白为啥运行自己的可执行时为啥要用  ./ ,而运行系统指令就不需要的原因了。因为存在环境变量PATH,其中就包含了系统指令的当前的执行目录,因此bash可以直接找到系统指令的执行路径(如ls的),但我们的程序路径不存在于PATH中,就需要通过.来自定当前的路劲。


http://www.kler.cn/a/409606.html

相关文章:

  • Linux 命令和 vi/vim 命令
  • TSmaster CAN/CANFD 诊断(Diagnostic_CAN)
  • MySQL中的ROW_NUMBER窗口函数简单了解下
  • 数据结构-位运算笔记
  • C++:探索AVL树旋转的奥秘
  • 46.坑王驾到第十期:vscode 无法使用 tsc 命令
  • 力扣-Hot100-栈【算法学习day.40】
  • 梧桐数据库的高效索引技术行业调研报告
  • 理解clickhouse 里的分区和分片键区别
  • 降本增效的新利器
  • 第49届ICPC亚洲区域赛,非凸科技再次支持上海赛站
  • TensorFlow手动更新模型特定变量
  • 重写radioselect类自定义个性化单选框
  • Flink四大基石之Window
  • 黄仁勋:人形机器人在内,仅有三种机器人有望实现大规模生产
  • Web 学习笔记 - 网络安全
  • 简单快速区分Shell, sh, bash:
  • C/C++中的回调用法
  • 【测试工具JMeter篇】JMeter性能测试入门级教程(二)出炉,测试君请各位收藏了!!!
  • 《用 Python 和 Tkinter 打造惊喜弹窗小应用教程》
  • 【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作
  • 【青牛科技】D3308 一块带有 ALC 的双通道前置放大器。它适用于立体声收录机和盒式录音机。
  • 小米C++ 面试题及参考答案下(120道面试题覆盖各种类型八股文)
  • 对象的大小
  • Paddle Inference部署推理(十二)
  • Flink Standalone 集群模式安装部署教程