【Linux】环境变量

📝前言:

这篇文章我们来讲讲Linux环境变量

🎬个人简介:努力学习ing

📋个人专栏:Linux

🎀CSDN主页 愚润求学

🌄其他专栏:C++学习笔记C语言入门基础python入门基础C++刷题专栏


环境变量

一,什么是环境变量

环境变量是一种存储配置信息 的机制,这些信息会影响进程的运行环境和行为。比如,我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功。原因就是:有相关环境变量帮助编译器进行查找。

环境变量具有全局性,环境变量会被子进程继承

二,常见的环境变量

(1)查看环境变量

  • env:查看所有环境变量
  • echo $名称$:查看对应名称的变量内容【变量 = 名称 + 内容】

示例(env):

示例(echo $PATH):

(2)常见的环境变量

从上面的env命令,我们可以看到很多相关的环境变量。下面点出几个相对重要的。

  • PATH : 指定命令的搜索路径
  • USER:当前登陆系统的用户
  • LOGNAME:当前登录用户的名称
  • HOME : 当前用户的主目录路径(即用户登陆到Linux系统中时,默认的⽬录)
  • SHELL : 当前Shell,它的值通常是/bin/bash
  • PWD:用户当前所在的文件系统目录路径
  • OLDPWD:上一个工作目录(cd -就是用这个)

关于 USERLOGNAME以及HOME的变化:

  • su rootUSERLOGNAME不会变,因为没有重新登陆,但是HOME会变
  • 我们直接su -(用root用户重新登陆 ),三个都会变成root对应的

(3)环境变量的来源及组织

环境变量的来源

我们在每次登陆Xshell的时候,都会创建一个父进程bash,这个bash是我们和系统交互的重要软件。

在登陆时,bash都要加载系统的相关配置文件 ,在加载配置文件的时候,就会读取文件中的环境变量。通过加载.bash_profile.bashrc文件实现。

  • .bash_profile :Bash shell 在用户登录时执行的配置文件。它主要用于进行一次性的、与登录相关的环境初始化工作,例如设置环境变量、定义命令别名、执行启动脚本等。(可以简单理解为这是一个shell脚本,执行多条命令来完成环境初始化操作。shell脚本就是把多条命令写在文件里面,执行文件就可以实现执行多条命令)
  • .bashrc:用于设置与交互式环境相关的配置,例如命令提示符样式、命令补全、历史记录设置等
  • 登陆时会先执行.bash_profile文件,在.bash_profile文件里面调用.bashrc

环境变量的组织(环境变量表)

  • 加载好环境变量以后,bash会用一张环境变量表 (哈希表:名称 = 内容,这个 = 相当于:)来组织环境变量。
  • 这个表储存在 bash 的上下文里。假设有 10 个登陆,则分别创建 10 个bash,每一个 bash 都要加载配置文件,都有环境变量表。

  • environ 是一个全局变量,它指向一个以空指针结尾的字符指针数组,该数组保存了当前进程的所有环境变量。

三,bash如何利用PATH执行命令

为什么执行我们自己的test可执行文件需要:./test呢,但是执行ls却可以直接写。这就和环境变量PATH有关!

(1)命令行参数表

什么是命令行参数?

  • 当我们输入ls -a -l的时候,我们输入的其实是一个长字符串。bash会以空格为分割,把我们的长字符串拆成ls-a-l,这三个就叫做命令行参数。
  • bash 会把拆分好的命令行参数,存入一个以空指针结尾的字符指针数组,该数组保存了该条命令的所有命令行参数。(不同的命令行参数,是实现程序不同的子功能)

(2)理解使用PATH过程

  • 当我们输入ls -a -l指令,bash会根据这条指令生成命令行参数表
  • 要执行ls,就必须先找到它
  • 于是,bash就在环境变量表中找到PATH环境变量
  • PATH里面的路径,拼接上ls这个命令,查找有没有对应路径的可执行。
  • 如果找到了就执行,没找到就是command not found

四,与环境变量有关的其他命令

(1)添加PATH

  1. PATH=/new/path,会覆盖PATH内容(当前会话有效)
  2. export PATH=$PATH:/new/path:可以往PATH里面添加/new/path这条路径。(当前会话有效)
  3. 永久添加的方法:把 export 命令添加到 .bash_profile 或者 .bashrc 文件里

(2)设置环境变量

PATH一模一样,因为PATH本身就是环境变量

  1. export MY_VAR=my_value(当前终端会话有效,使用export设置的变量才可以被继承)
  2. MY_VAR=my_value:设置本地变量,本地变量,子进程无法继承(所以,其实bash会记录两套变量)
  3. 永久添加:把 export 命令添加到 .bash_profile 或者 .bashrc 文件里(就是在文末加)【第三点由AI生成】
    • 修改 ~/.bashrc 文件(适用于交互式非登录 shell)
    • 修改 ~/.bash_profile 文件(适用于登录 shell)
  • unset NAME:删除NAME环境变量
  • set: 显示本地定义的shell变量和环境变量

(3)获取环境变量

  • 方法一:echo

  • 方法二:通过environ

    • environ就是一个全局变量,environ没有包含在任何头文件中,使用时要用extern声明:
cpp 复制代码
#include <stdio.h>

int main(int argc, char *argv[])
{
	extern char **environ;
	int i = 0;
	for(; environ[i]; i++)
	{
		printf("%s\n", environ[i]);
	}
	return 0;
}
  • 方法三(推荐):使用系统调用:getenv(NAME),在<stdlib.h>头文件
    • 得到变量NAME的内容
    • 返回的是首地址(即:这个内容字符串的首地址)
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
	printf("%s\n", getenv("PATH"));
	return 0;
}

(4)内建命令

  • 内建命令是不需要创建子进程的,由 shell 本身实现的命令(或系统调用)。
  • 如:cdpwdexport

五,main函数的命令行参数

实际上,main 函数并不是程序的第一个函数,main 函数也是被调用的,被 start 调用,main 函数也是可以接受参数的.。

main 函数的参数:

cpp 复制代码
int main(int argc, char *argv[], char *env[])
  • argc:命令行参数的个数
  • argv:命令行参数表
  • nev:环境变量表(父进程会自动传)

🌈我的分享也就到此结束啦🌈

要是我的分享也能对你的学习起到帮助,那简直是太酷啦!

若有不足,还请大家多多指正,我们一起学习交流!

📢公主,王子:点赞👍→收藏⭐→关注🔍

感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关推荐
JANYI20182 分钟前
在c++中老是碰到string&,这是什么意思?
开发语言·c++
passionSnail42 分钟前
《MATLAB实战训练营:从入门到工业级应用》趣味入门篇-用声音合成玩音乐:MATLAB电子琴制作(超级趣味实践版)
开发语言·matlab
星川皆无恙1 小时前
大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现
大数据·运维·爬虫·python·机器学习·数据分析·系统架构
shenyan~1 小时前
关于Python:9. 深入理解Python运行机制
开发语言·python
天堂的恶魔9461 小时前
C++ - 仿 RabbitMQ 实现消息队列(1)(环境搭建)
开发语言·c++·rabbitmq
Jia ming1 小时前
【奔跑吧!Linux 内核(第二版)】第1章:Linux 系统基础知识
linux·内核·linux内核
吃货界的硬件攻城狮2 小时前
【STM32 学习笔记】EXTI外部中断
笔记·stm32·学习
殇淋狱陌2 小时前
【Python】常用命令提示符
开发语言·python·虚拟环境
anqi272 小时前
在sheel中运行Spark
大数据·开发语言·分布式·后端·spark
吃货界的硬件攻城狮2 小时前
【STM32 学习笔记 】OLED显示屏及Keil调试
笔记·stm32·学习