【Linux】环境变量

环境变量

1.命令行参数


  1. 往命令行输入的字符串,被 bash 进程以空格分割成各种命令行参数。bash 进程创建一张命令行参数表(argv),用来支持选项功能 。
  2. main 函数的参数 argv(命令行参数表),是程序实现不同子功能的方法。
  3. 输入的指令同样支持选项功能(指令,大部分都是C写的)

2.环境变量:PATH

  1. 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
  2. 我们在编写C/C++代码在链接的时候,不知道我们链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  3. 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
  1. 要执行一个程序时,系统必须要先找到该程序。我们写的程序需要带上当前路径:./
  2. 执行系统命令不需要带上./是因为系统中存在环境变量,帮助系统找到目标二进制文件(可执行程序)
  3. 不推荐将二进制文件拷贝到 usr/bin 路径下。
    问题:执行系统命令时,系统为什么会在 usr/bin 路径下查找?

答案:存在环境变量:PATH。环境变量 PATH 中的内容含有多个路径,系统会在这些路径中搜索指令。



用户登入时,系统创建 bash 进程,bash 会读取系统配置文件(.bashrc 和 .bash_profile)中的关于环境变量的内容,在 bash 进程内部构成一张环境变量表(指针数组,指向字符串),同时 bash 还可以接收用户的指令,创建命令行参数表。bash 有两张表(命令行参数表,环境变量表)

总结:

  1. 如果 Linux 系统有10个用户登入时:系统会创建10个bash进程,每一个 bash 进程,都存在命令行参数表和环境变量表。
  2. 用户登入时,系统创建 bash 进程,bash 进程读取系统配置文件,在 bash 进程内部创建环境变量表。当在命令行输入命令(例如:ls -a -l),先做命令行解析获得命令行参数表,在表中获取可执行文件的程序名,再取指定的环境变量 PATH 中查找,找到就运行,没找到就报错。
  3. 指令的查找操作是由 bash 进程亲自查找的。

3.其它环境变量

查看环境变量方法:echo $环境变量名

环境变量名:

  1. HOME:用户家目录(cd ~ 能被执行的原因:进程 bash 解析命令行,创建命令行参数表,其中的 ~ 去匹配环境变量表中的 HOME)
  2. SHELL:当前Shell的版本,通常是/bin/bash。
  3. USER:当前用户。
  4. LOGNAME:登入用户。
  5. HISTSIZE:能保存历史命令的总条数。
  6. HOSTNAME:主机名。
  7. SSH_TTY:终端设备号。
  8. PWD:当前工作路径。
  9. OLDPWD:上一次的工作路径(cd - 能被执行的原因:进程 bash 解析命令行,创建命令行参数表,其中的 - 去匹配环境变量表中的 OLDPWD)
  1. 环境变量被 bash 直接使用,间接被用户使用。
  2. su:提权,USER和LOGNAME没有被修改。
  3. su -:切换为 root 用户,USER和LOGNAME被修改。

4.获得环境变量的方法

1.命令操作

  1. env:查看所有的环境变量。
  2. echo $环境变量名:打印环境变量名所对应的内容。
  3. export 环境变量名=环境变量内容:导入环境变量,可以使用 env 命令查看。
  4. unset 环境变量名:删除环境变量。
  5. set 变量名:显示本地定义的 shell 变量/环境变量。

2.代码操作

  1. main 函数参数char* env[],获取环境变量。

main 函数其实不是程序的入口,main 函数被 _start 函数调用,内部记录了 main 函数参数的个数 arg_count,通过 arg_count 调用不同参数数量的 main 函数。

  1. char* getenv(const char* name):根据环境变量名,返回环境变量的内容。


1. 环境变量被子进程所继承,可以通过环境变量做个性化操作。
2. 环境变量对子进程来说是共享的,但倘若子进程修改环境变量会发生写时拷贝。

例如:写一个程序,只有我能执行,即便是 root 用户都无法执行。

  1. 全局变量:extern char** environ(二级指针,指向环境变量表)获取环境变量。

environ 没有包含在任何头文件中,所以在使用时要用 extern 声明。

5.理解环境变量的特性

  1. 环境变量的全局特性,可以被子孙进程继承。

6.本地变量

  1. set:查看环境变量和本地变量。
  2. unset 本地变量:删除本地变量。

bash 设置本地变量的原因:

  1. Shell 是一种脚本语言,需要本地变量支持。
bash 复制代码
bash i=0; while [ $i -le 10 ]; do echo $i; let i++; done

注意:本地变量不会被子进程所继承,只能在 bash 进程内部使用。

  1. 一些本地变量具有特殊用途。

PS1='[\u@\h \W]\$ ':打印命令行。

PS2='> ':续行。

1.内建命令

export 本地变量:将本地变量变为环境变量。

2.Shell脚本

相关推荐
Leinwin31 分钟前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_8653825035 分钟前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇40 分钟前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7591 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
Thera7771 小时前
C++ 高性能时间轮定时器:从单例设计到 Linux timerfd 深度优化
linux·开发语言·c++
运维小欣1 小时前
智能体选型实战指南
运维·人工智能
yy55271 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔4 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密4 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器