【Linux】环境变量

1.环境变量

1-1 概念介绍

  • 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数;
  • 如:在编写C/C++代码的时候,在链接的时候,从来不知道所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

命令行参数:

函数有参数,没有参数也用void表示传空;那么main函数作为整个程序的入口,是不是也有参数呢,有的话是什么?

事实上main函数也有参数,main函数被系统start函数调用,main函数的参数为main(int argc,char* argv\[\]);int argc表示参数的个数,char * argv\[\]是一个指向字符或字符串的数组。

编写代码查看数组内的内容:

先被bash获得,然后被切分为不同选项放入指针数组中。

再来看看下面的程序代码:

这个程序代码清晰地表示出了:命令行参数用途是为了让一个程序通过选项,实现不同的子功能。

main函数的命令行参数,是实现程序不同子功能的方法。这也是指令选项的实现原理。在main函数启动时,对应的进程中会有一张argv表,用来支持实现选项功能。

为什么之前写main函数不用写这两个参数?因为我们的程序只有一个功能。

1-2 一个例子,一个环境变量

要执行一个程序,必须先找到它,(谁找?bash找,通过PATH来找环境变量),所以每次执行我们自己的程序时需要加上./code.c,那为什么执行系统命令时不用添加路径呢?因为系统中存在环境变量,来帮助系统找到目标二进制文件。

环境变量:PATH,系统中搜索指令的默认搜索路径。

查看环境变量:

一个路径一个路径地找,以冒号作为分隔符,如果都没有找到就会报错。

【问题1】站在存储的角度上,如何理解环境变量呢?

在系统初始启动时,在bash内部形成一张环境变量表,这张表就是一个指针数组的样子,我们查看到的环境变量的内容都是用指针一个一个指向的。

bash行输入命令时,命令行参数表先获取输入内容的命令参数,然后再由bash获取指令的环境变量,一个一个对应匹配去环境变量表中找到它的路径,所以bash内部有两张表。

【问题2】环境变量,最开始从哪里来的呢?

环境变量最开始是从系统相关的配置文件来的。

【问题3】为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序就需要带路径才能执行?

如果把我们自己的环境变量配置放入这个系统默认的环境变量文件中,再去执行代码的编译运行,那么编译时就不用带路径了。

如果Linux系统有十个用户登录呢?存在十个bash,然后从自己的环境变量表中读取对应的系统配置文件。

1-3 认识更多的环境变量

  • HOME:环境变量是当前用户的家目录
  • PATH:指定命令的搜索路径
  • SHELL:当前shell,它的值通常是/bin/bash

1-4 获取环境变量的方法

1.环境变量相关的指令

export MYENV 导入自己的环境变量

env 显示所有的环境变量

echo $xxxx 显示某个环境变量值

unset 取消设置自己的环境变量

2.命令行参数最多有几个?

命令行参数最多有3个,是父进程传递给我们的

3.获得环境变量的方法:

方法一:main函数获得父进程的(bash)环境变量,环境变量可以被子进程继承。

方法二:getenv,获得指定环境变量

方法三:environ,获取所有环境变量的列表

1-5 理解环境变量的特性

1.环境变量具有全局特性

2.补充概念,给后面的内容埋个伏笔

a.本地变量

这个是本地变量,但bash会记录环境变量和本地变量,可以用set来查看,本地变量不会被子进程继承,只在bash内部被使用。

相关推荐
kaoa00023 分钟前
Linux入门攻坚——90、Hadoop-2-MapReduce计算框架及Hadoop生态系统概览
linux·hadoop·mapreduce
The Chosen One98539 分钟前
OS第二章随手记(2.1)
linux·运维·服务器·笔记
xx~t2 小时前
嵌入式——ARM——汇编1
linux·汇编·arm开发·嵌入式硬件·arm
ly76892 小时前
磁盘 I/O 延迟突增:用 iostat、blktrace 与火焰图定位到具体调用栈
java·linux·前端·数据库·iostat·磁盘 i/o·blktrace
程序员-Benothing2 小时前
Linux查找文件命令:find、locate、which、whereis实战
linux·运维·服务器
j7~2 小时前
【Linux网络加餐】(篇七)网络版计算器(中):协议落地、报文分隔与完整链路
linux·c++·网络编程·tcp·报文分割·网络计算器·协议落地
团子股股东峥哥2 小时前
day39-RHEL-访问网络附加存储
linux·运维·服务器
不会写代码的小可爱&&2 小时前
深入 Linux 内核内存管理:slab/slub 分配器原理剖析
linux·硬件架构
H_oRIZoN_3 小时前
Linux入门DAY44 ARM 入门 Day02|ARM 汇编指令、模式切换、栈操作、汇编 C 混合编程
linux·单片机·嵌入式硬件·arm·linux应用编程
程序员-Benothing4 小时前
Linux文件查看与编辑:cat、less、tail、vim快速入门
linux·运维·服务器