【Linux】环境变量

🔥个人主页🔥:孤寂大仙V
🌈收录专栏🌈:Linux
🌹往期回顾🌹:【Linux】进程优先级与进程切换
🔖流水不争,争的是滔滔不


  • 一、环境变量的定义
  • 二、命令行参数
  • 三、常见环境变量
    • PATH
    • USER和LOGNAME
    • HISTSIZE
    • PWD
    • 取消环境变量
  • 四、获取环境变量
      • 通过代码获取环境变量
    • 环境变量的特性
      • getenv函数:获取指定的环境变量
      • environ获取环境变量
  • 五、本地变量
  • 六、定义环境变量的方法
    • 临时定义(仅对当前会话有效)
      • 使用export命令:
      • 在命令行直接赋值(适用于简单变量):
    • 永久定义(对所有会话有效)
      • 通过修改配置文件(适用于特定用户)
      • 对于所有用户(系统级别的环境变量):

一、环境变量的定义

在 Linux 系统中,环境变量是一种动态命名的值,它可以影响系统运行时进程的行为。这些变量包含了有关系统配置、用户偏好以及应用程序运行环境等信息。例如,PATH环境变量定义了系统在哪些目录中查找可执行文件。当你在终端中输入一个命令(如ls)时,系统会根据PATH环境变量所指定的目录顺序来查找ls这个可执行文件。

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

二、命令行参数

命令行参数是在运行程序时,在程序名称后面添加的一些额外信息,程序可以读取这些信息来调整其行为或获取所需的输入。
在 C 语言中,命令行参数通过 main 函数的参数来接收

argc 是一个整数,代表命令行参数的数量,其中包含程序名称本身。
argv 是一个字符指针数组,其中 argv[0] 存储程序名称,argv[1] 存储第一个参数,以此类推。

#include<stdio.h>
int main(int argc,char *argv[])
{for(int i=0;i<argc;i++){printf("argv[%d]: %s\n",i,argv[i]);}return 0;
}

在这里插入图片描述
在这里插入图片描述
如图和代码,可看出命令行参数运行时存储在指针数组中。


为更深刻理解和观察命令行参数是怎么用的,请看下面代码

#include <stdio.h>                                 
#include <string.h>        // main有参数吗?
int main(int argc, char *argv[])
{if(argc!= 2){printf("Usage: %s [-a|-b|-c]\n", argv[0]);}const char *arg = argv[1];if(strcmp(arg, "-a")==0)printf("这是功能1\n");else if(strcmp(arg, "-b")==0)printf("这是功能2\n");else if(strcmp(arg, "-c")==0)printf("这是功能3\n");elseprintf("Usage: %s [-a|-b|-c]\n", argv[0]);return 0;
}

在这里插入图片描述
在这里插入图片描述
代码首先检查参数数量是否为 2,如果不是,就打印使用说明。然后获取第二个参数(argv[1]),通过strcmp函数与"-a"、“-b”、"-c"进行比较,根据比较结果输出相应的功能信息,如果都不匹配,也打印使用说明。

命令行参数让一个程序可以通过选型实现不同的子功能。 Linux是c语言写的,我们在命令行输入的指令就是命令行参数实现的。命令行参数是指令实现的原理


那么这里有一个问题,上面不是聊了我们的./code和系统指令是一个意思,但是为什么我们自己写的就要加./呢?
其实系统指令是在Linux系统中的uers/bin目录下的,我们可以把自己写的命令行参数实现的可执行程序放入uers/bin目录下,这样也可以直接进行调用。但是不建议这么干。

那么问题又来了,系统怎么知道要执行命令的时候要去user/bin目录下查呢?

因为环境变量

三、常见环境变量

查看所有的环境变量 用env指令
在这里插入图片描述

PATH

PATH : 指定命令的搜索路径

查看环境变量
指令如下

echo $NAME //NAME是环境变量的名称 

在这里插入图片描述
如图,就是指定命令的路径。


要想把我们自己的路径中的可执行放入环境变量中,用到指令如下:

PATH=$PATH:可执行程序所在的路径

其实这里把自己的可执行程序的路径放在环境变量中,是内存级的重新启动就会自己没了。


从存储角度理解环境变量
在这里插入图片描述
bash会形成一张表,叫环境变量表如上图这样存储环境变量。bash还有一张命令行参数表。bash先拿到指令在环境变量中进行查找。
所以要执行一个程序,会先找到bash通过PATH环境变量来找指令。

USER和LOGNAME

查看当前用户是谁

HISTSIZE

查看历史命令,bash会把历史命令记录下来,记录最近的1000条

PWD

记录了当前的工作路径

取消环境变量

unset 要取消的环境变量

四、获取环境变量

通过代码获取环境变量

在这里插入图片描述
在这里插入图片描述

环境变量的特性

环境变量是可以被子进程继承下去的(也就是说环境变量是全局的)
其实我们所写的所有进程都是子进程,因为它们(不包括由我们所写的进程所创建的进程)的父进程都是bash
也就是说bash就是把它的环境变量通过main函数传参给了我们所写的进程


getenv函数:获取指定的环境变量

在这里插入图片描述
根据环境变量的名字获取环境变量的内容
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main(int argc,char* argv[],char* env[])
{pid_t id=fork();if(id==0){//子进程执行char* username=getenv("USER");printf("you are: %s\n",username);}return 0;
}

在这里插入图片描述


用于验证身份
在这里插入图片描述
在这里插入图片描述
如果当前用户不是我们设置的用户,即使是root用户来了也不行

environ获取环境变量

在这里插入图片描述
这里是一个二级指针,指向了char* env[]这个指针数组来查看对应的变量
在这里插入图片描述
在这里插入图片描述

五、本地变量

本地变量:作用域仅限于当前会话或进程及其子进程,不同用户的本地变量相互独立,不会影响其他用户或系统层面的环境配置。本地变量是不会被子进程继承的,只在bash内部有效的变量


创建本地变量
myname,赋值为用户

myname=hbx

在这里插入图片描述

验证本地变量的特性
本地变量不会被子进程继承。只在bash中
在这里插入图片描述


可以发现本地变量不会被子进程继承


移除本地变量

unset 本地变量名或者是环境变量名
unset myname

在这里插入图片描述
移除成功

六、定义环境变量的方法

临时定义(仅对当前会话有效)

使用export命令:

我们可以同过export命令,把子进程的东西给父进程。但是这时候就会出现疑惑,子进程不是继承父进程的东西吗。其实export是内建命令不需要创建子进程,而是让bash自己亲自执行,bash自己掉函数或者进行系统调用。

例如,要定义一个名为MY_VARIABLE的环境变量,并将其值设置为my_value,可以在终端中输入以下命令:

plaintext
export MY_VARIABLE = my_value

注意,在等号两边不能有空格,否则会出现错误。正确的写法也可以是export MY_VARIABLE=my_value。
现在,在这个终端会话中,任何可以访问环境变量的程序都能够获取MY_VARIABLE的值。例如,在一个脚本文件中可以通过$MY_VARIABLE来引用这个变量的值。

在命令行直接赋值(适用于简单变量):

可以直接使用VARNAME=value的形式来定义一个变量,但这种变量不是环境变量,只是一个普通的 shell 变量。如果要将其变成环境变量,可以使用export命令。例如:

plaintext
MY_VAR=test
export MY_VAR

永久定义(对所有会话有效)

通过修改配置文件(适用于特定用户)

对于 Bash shell 用户(大多数 Linux 默认的 shell):
可以编辑用户主目录下的.bashrc文件(这个文件在用户每次打开一个新的 Bash 终端时会被读取)。使用文本编辑器(如vi或nano)打开~/.bashrc文件,在文件末尾添加如下内容:

plaintext
export MY_PERMANENT_VARIABLE = my_permanent_value

保存文件后,在终端中运行source ~/.bashrc或者重新打开一个终端,新定义的环境变量就会生效。这个变量会在用户每次登录或者打开新的 Bash 终端时自动设置。

对于所有用户(系统级别的环境变量):

可以编辑/etc/profile文件。这是一个系统级别的配置文件,会对所有用户生效。在/etc/profile文件中添加环境变量定义的方式与在.bashrc文件中类似,例如:

plaintext
export SYSTEM_VARIABLE = system_value

注意,修改/etc/profile文件需要管理员权限(root用户权限)。修改完成后,所有用户在下次登录或者打开新的终端时,新的环境变量就会生效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5455.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring MVC:设置响应

目录 引言 1. 返回静态页面 1.1 Spring 默认扫描路径 1.2 RestController 1.2.1 Controller > 返回页面 1.2.2 ResponseBody 2. 返回 HTML 2.1 RequestMapping 2.1.1 produces(修改响应的 Content-Type) 2.1.2 其他属性 3. 返回 JSON 4. 设置状态码 4.1 HttpSer…

开篇:吴恩达《机器学习》课程及免费旁听方法

课程地址&#xff1a; Machine Learning | Coursera 共包含三个子课程 Supervised Machine Learning: Regression and Classification | Coursera Advanced Learning Algorithms | Coursera Unsupervised Learning, Recommenders, Reinforcement Learning | Coursera 免费…

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至&#xff1a;【C】模板&#xff08;初阶&#xff09; 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参&#xff0c;也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …

快手SDK接入错误处理经验总结(WebGL方案)

1、打包时提示Assets\WebGLTemplates\ks路径下未找到Index.html文件错误 处理方法&#xff1a;直接使用Unity默认模板下的Index.html文件即可 文件所在路径&#xff1a;Unity安装路径\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates\Default 参考图&a…

用edge浏览器追剧音量太小?安装音量增强器可解忧

0 源起 春节佳节将至&#xff0c;可以利用这个难得的假期追一追想看而没空看的剧了。 但是在用Edge浏览器播放网页中的视频时&#xff0c;有时音量太小&#xff0c;根本没法听清楚&#xff0c; 遇到这种情况时&#xff0c;尽管Edge浏览器本身没有提供音量控制功能&#xff0…

Alluxio 联手 Solidigm 推出针对 AI 工作负载的高级缓存解决方案

作者&#xff1a;Wayne Gao, Yi Wang, Jie Chen, Sarika Mehta Alluxio 作为全球领先的 AI 缓存解决方案供应商&#xff0c; 提供针对 GPU 驱动 AI 负载的高速缓存。其可扩展架构支持数万个节点&#xff0c;能显著降低存储带宽的消耗。Alluxio 在解决 AI 存储挑战方面的前沿技…

Excel 技巧15 - 在Excel中抠图头像,换背景色(★★)

本文讲了如何在Excel中抠图头像&#xff0c;换背景色。 1&#xff0c;如何在Excel中抠图头像&#xff0c;换背景色 大家都知道在PS中可以很容易抠图头像&#xff0c;换背景色&#xff0c;其实Excel中也可以抠简单的图&#xff0c;换背景色。 ※所用头像图片为百度搜索&#x…

JavaScript笔记基础篇03——函数

黑马程序员视频地址&#xff1a;黑马程序员前端JavaScript入门到精通全套视频教程https://www.bilibili.com/video/BV1Y84y1L7Nn?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes 目录 函数 函数的使用 1.函数的声明语法 2.函数的…

manim(manimgl)安装教学-win11(2024-08)

manim 目前的两种版本&#xff1a;★★ 稍微捋一捋【项目中的 readme.md 十分重要】 manimgl 是 Grant Sanderson&#xff08;YouTube频道 3Blue1Brown的作者&#xff09;等人开发。 现在为 manimgl&#xff0c;在维护中。 manimCE 是2020年后的 manim 分支 manim community e…

常见Arthas命令与实践

Arthas 官网&#xff1a;https://arthas.aliyun.com/doc/&#xff0c;官方文档对 Arthas 的每个命令都做出了介绍和解释&#xff0c;并且还有在线教程&#xff0c;方便学习和熟悉命令。 Arthas Idea 的 IDEA 插件。 这是一款能快速生成 Arthas命令的插件&#xff0c;可快速生成…

DS18B20温度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.工作时序 3.工作原理&#xff1a;复位脉冲与应答脉冲 4.工作原理&#xff1a;写时序 5.工作原理&#xff1a;读时序 6.工作原理&#xff1a;DS18B20读取的数据格式 7.工作原理&#xff1a;DS18B20配置步骤 三、程序设计 ma…

Chrome远程桌面无法连接怎么解决?

Chrome远程桌面连接已停止工作 Chrome远程桌面是一款极为便捷的浏览器插件&#xff0c;能够帮助用户将自己的计算机连接到其他设备&#xff0c;无论是手机、平板电脑还是其他电脑。然而&#xff0c;在实际使用中&#xff0c;许多用户可能会面临各种各样的问题&#xff0c;比如…

靠右行驶数学建模分析(2014MCM美赛A题)

笔记 题目 要求分析&#xff1a; 比较规则的性能&#xff0c;分为light和heavy两种情况&#xff0c;性能指的是 a.流量与安全 b. 速度限制等分析左侧驾驶分析智能系统 论文 参考论文 两类规则分析 靠右行驶&#xff08;第一条&#xff09;2. 无限制&#xff08;去掉了第一条…

如何实现亿级用户在线状态统计?

亿级用户在线场景分析与解决方案 目录 亿级用户在线场景分析解决方案 2.1 基于总数的统计方案2.2 基于具体用户详情的统计方案 具体实现 3.1 基于总数的统计方案3.2 基于用户标识的统计实现3.3 Spring Boot 中的实现 总结 1. 亿级用户在线场景分析 以 QQ 在线状态统计为例&am…

多线程杂谈:惊群现象、CAS、安全的单例

引言 本文是一篇杂谈&#xff0c;帮助大家了解多线程可能会出现的面试题。 目录 引言 惊群现象 结合条件变量 CAS原子操作&#xff08;cmp & swap&#xff09; 线程控制&#xff1a;两个线程交替打印奇偶数 智能指针线程安全 单例模式线程安全 最简单的单例&…

sql实战解析-sum()over(partition by xx order by xx)

该窗口函数功能 sum( c )over( partition by a order by b) 按照一定规则汇总c的值&#xff0c;具体规则为以a分组&#xff0c;每组内按照b进行排序&#xff0c;汇总第一行至当前行的c的加和值。 从简单开始一步一步讲&#xff0c; 1、sum( )over( ) 对所有行进行求和 2、sum(…

你还在用idea吗

从VIM、Emacs&#xff0c;到eclipse、Jetbrains, 再到VSCode&#xff0c;过去的三十年时间&#xff0c;出现了这三代IDE产品。现在属于AI的时代来了&#xff0c;最新一代的产品像Cursor、Windsurf&#xff0c;就在昨天&#xff0c;字节跳动发布了最新的IDE&#xff0c;就叫Trae…

Unity新版InputSystem短按与长按,改键的实现

目录 前言&#xff1a; 一、InputSystem简介 1.安装InputSystem包 2.创建配置文件 3.创建自定义的Actions 二、自定义输入类 三、改键 四、全代码 前言&#xff1a; 新版inputsystem是Unity推出的一种新的输入方式&#xff0c;它将设备与行为进行分离&#xff0c;通过…

Android AutoMotive --CarService

1、AAOS概述 Android AutoMotive OS是谷歌针对车机使用场景打造的操作系统&#xff0c;它是基于现有Android系统的基础上增加了新特性&#xff0c;最主要的就是增加了CarService&#xff08;汽车服务&#xff09;模块。我们很容易把Android AutoMotive和Android Auto搞混&…

AWTK-WEB 快速入门(3) - C 语言 Http 应用程序

AWTK-WEB 快速入门 - C 语言 Http 应用程序 XMLHttpRequest 改变了 Web 应用程序与服务器交换数据的方式&#xff0c;fetch 是 XMLHttpRequest 继任者&#xff0c;具有更简洁的语法和更好的 Promise 集成。本文介绍一下如何使用 C 语言开发 AWTK-WEB 应用程序&#xff0c;并用 …