【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脚本

相关推荐
Ronin-Lotus25 分钟前
嵌入式硬件篇---龙芯2k1000串口
linux·网络·python·嵌入式硬件·龙芯·2k1000
TangKenny28 分钟前
Linux Maven Install
linux·运维·maven
Fireworkitte36 分钟前
Maven 项目中集成数据库文档生成工具
linux·运维
文牧之1 小时前
PostgreSQL的扩展 passwordcheck
运维·数据库·postgresql
FBI HackerHarry浩1 小时前
云计算 Linux Rocky day03
linux·运维·服务器
石硕页1 小时前
windows下安装docker、dify、ollama
运维·docker·容器
m0_694845571 小时前
云服务器如何连接和远程操作?
linux·运维·服务器·安全·云计算
啃火龙果的兔子2 小时前
宝塔面板安装nodejs后,通过node -v获取不到版本号,报错node: command not found
linux·运维·centos
群联云防护小杜2 小时前
企业级高防CDN选型指南
运维·服务器·人工智能·自动化·ddos
XMAIPC_Robot3 小时前
基于 NXP + FPGA+Debian 高可靠性工业控制器解决方案
运维·人工智能·fpga开发·debian·边缘计算