当前位置: 首页 > news >正文

Linux——环境变量

✅<1>主页::我的代码爱吃辣
📃<2>知识讲解:Linux——环境变量
☂️<3>开发环境:Centos7
💬<4>前言:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

目录

一.基本概念

二.Linux系统中常见的环境变量

1.查看指定的环境变量

2.PATH

3.HOME

4.SHELL

三.环境变量的组织方式

四.添加环境变量

五.环境变量的继承

六.获取环境变量

1.命令行第三个参数

2.通过第三方变量environ获取

3.通过系统调用获取或设置环境变量


一.基本概念

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

 查看当前LInux系统的环境变量:

指令:

env

windows下的环境变量:

环境变量本质就是一种变量,一种K/V的对用关系,由变量名和变量值。

二.Linux系统中常见的环境变量

1.查看指定的环境变量

echo $NAME #NAME:环境变量名称

 例如:

2.PATH

指定命令的搜索路径.

  1. 我们平时写的一些C/C++代码,编译成可执行程序以后,通过 ./ 运行,本质是告诉操作系统可执行程序的位置。
  2. 但是系统自带的指令,本质也是C语言写的程序,为什么系统的指令不需要指定路径呢?
  3. 就是因为环境变量PATH里面存储了指定命令的搜索路径。

3.HOME

指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。

当我们每次登录系统的时候,系统就会记录下登录用户,并且填充HOME环境变量,并且创建bash进程帮我们执行 cd /home/XXX 的命令,进入我们自己的家目录,这就是我们为什么一进入系统,默认就在自己的家目录里。

普通用户:

root用户:

4.SHELL

当前Shell,它的值通常是/bin/bash。

三.环境变量的组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串,表的最后一个位置是NULL。

四.添加环境变量

我们刚刚介绍了PATH环境变量,指定命令的搜索路径.那么我们可不可以将自己写的可执行程序的查询路径也添加进PATH里,这样我们的可执行程序,也可以实现不需要 ./ 就可以直接执行了。

测试代码:test.c

#include <stdio.h>
#include <unistd.h>int main()
{int n = 3;while (n){printf("原神启动:%d\n", n);sleep(1);n--;}
}

makefile:

ttest:test.cgcc -o $@ $^
.PHONY:clean
clean:rm -rf ttest

 方法一:

使用export将我们该可执行程序的路径导入PATH中,后续可以不用加 ./ 就可以直接运行可执行程序,因为操作系统可知直接通过环境变量中的地址找到可执行程序。

export PATH=路径

 注意:

这样会有一个很尴尬的问题就是我们的PATH中只有这一个路径了,即之前的TATH环境变量中的其他路径被我们导入的路径覆盖了。

我们这样导入环境变量:

export PATH=$PATH:路径

方法二:

将可执行程序拷贝到 /usr/bin目录下,/usr/bin目录就是系统默认的命令存储的路径。

sudo cp ./ttest /usr/bin

本质将可执行程序放进/usr/bin目录下的过程,就是软件安装的过程。

上述这种添加变量的方式,就是将命令添加到系统环境中,还有一种添加变量的方式是将变量添加到本地,这种变量我们称之为本地变量。

例如:

hello=100

这就是添加了一个本地变量。

五.环境变量的继承

  1. 环境变量是可以被子进程继承的。
  2. 我们使用 export 导入的进程,就可以使用 echo 命令查询得到,echo 本质也是一个程序,之所以echo 可以查询到我们导入bash的环境变量本就是,echo 继承了bash的环境变量。
  3. 但是仅仅只是环境变量可以被子进程继承,本地变量是不可以子进程继承。

六.获取环境变量

1.命令行第三个参数

我们先看看命令行参数:

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

注意:

  1. argv是一个指针数组,数组每一个元素都是一个char*,每一个char*都指向了一个字符串。
  2. argc是argv数组的元素个数。

 注意:

  1. argv数组存储的就是我们命令行输入的以空格为分隔的字符串。
  2. 顺序是从左往右

 命令行的第三个参数:

测试代码:

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

运行结果:

注意:

  1. env也是一个指针数组,每一个数组元素存储的就是一个环境变量。
  2. 证明了环境变量是可以被子进程继承的。
  3. 应证了环境变量的组织方式。

2.通过第三方变量environ获取

 测试代码:

#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;
}

运行结果:

 注意:

  • libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

3.通过系统调用获取或设置环境变量

系统调用:

getenv()

getenv参数是环境变量名,返回的是环境变量值字符串,如果没找到对应的环境变量,就返回NULL。

测试代码:

[wq@iZuf6hzw565sb02fomef99Z 23_9_12]$ HELLO=100#本地变量
[wq@iZuf6hzw565sb02fomef99Z 23_9_12]$ export MYHELLO=100#环境变量
#include <stdio.h>
#include <stdlib.h>
int main()
{if (getenv("PATH")){printf("PATH:%s\n", getenv("PATH"));}if (getenv("MYHELLO")){printf("MYHELLO:%s\n", getenv("MYHELLO"));}if (getenv("HELLO")){printf("HELLO:%s\n", getenv("HELLO"));}return 0;
}

 注意:

  1. 环境变量通常具有全局属性,可以被子进程继承下去。
  2. 我们之前说过本地变量不会被子进程继承,上面的代码也可以看出来。
  3. 但是为什么使用命令echo就可以查询到本地变量?因为echo是内建命令。

相关文章:

Linux——环境变量

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——环境变量 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;环境变量(environment variables)一般是指在操作系统中用来指定操作…...

Screen的详细全面安装教程及Screen的用法

Screen可以大大提高终端使用效率&#xff0c;是Linux系统管理和运维的必备技能。当我们开启Screen后&#xff0c;只要Screen进程没有终止&#xff0c;其内部运行的会话都可以恢复。即使网络连接中断&#xff0c;用户也可以重新进入已开启的Screen中&#xff0c;对中断的会话进行…...

生成树、Prufer序列的计数问题:0912T1

看到生成树计数&#xff0c;很容易想到生成树计数 然后发现每个点有度数限制&#xff0c;我们可以先考虑枚举每个点的度数&#xff08;也可以是Prufer 序列中的出现次数&#xff09; 假设出现次数为 a a a&#xff0c;可以得出其生成树方案为 n ! ∏ ( a i − 1 ) ! \frac{…...

SQL_牛客网_SQL264_求每个登陆日期的次日留存率

牛客每个人最近的登录日期(五) 牛客每天有很多人登录&#xff0c;请你统计一下牛客每个日期新用户的次日留存率。 有一个登录(login)记录表&#xff0c;简况如下: id user_id client_id date 1 2 1 2020-10-12 2 3 2 2020-10-12 3 1 2 2020-10-…...

Hive 基础知识

目录 1.基础概念1.1 定义1.2 组件1.3 元数据1.4 内部表和外部表 2. Hive与关系型数据库的对比3. Hive 数据存储4. 参考文献 1.基础概念 1.1 定义 Hive是一个基于Hadoop的数据仓库基础设施工具&#xff0c;它可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查…...

【数据结构】树的基础知识及三种存储结构

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …...

ABB 3BHB003688R0101接口模块

通信接口&#xff1a;接口模块通常具有多种通信接口&#xff0c;如以太网、串行通信、Modbus、Profibus等&#xff0c;以便与其他设备和系统进行数据交换。 协议支持&#xff1a;它们支持各种通信协议&#xff0c;确保与不同制造商的设备和控制系统兼容。 数据转换和适配&…...

精简 jre 涉坑记录

主要参考&#xff1a;https://zhuanlan.zhihu.com/p/91496457 主要问题&#xff1a; 1&#xff09;jre 中有 client 和 server 之分。参考&#xff1a;关于JDK的Server和Client模式的切换_jacksonary的博客-CSDN博客 2&#xff09;对 copy 出来的 rt 进行打 zip 包时&#x…...

Java程序员学习算法路线规划总结

文章目录 前言&#xff1a;必须清楚得基本数据结构&#xff1a;1.需掌握哪些算法&#xff1f;2.学习步骤以及路线 前言&#xff1a;必须清楚得基本数据结构&#xff1a; 数组&#xff08;Array&#xff09; 链表&#xff08;Linked List&#xff09; 栈&#xff08;Stack&…...

火山引擎 ByteHouse:两个关键技术,揭秘 OLAP 引擎中的数据导入技术

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 数据导入是衡量 OLAP 引擎性能及易用性的重要标准之一&#xff0c;高效的数据导入能力能够加速数据实时处理和分析的效率。 作为一款 OLAP 引擎&#xff0c;火山引…...

深挖“范围经济”穿越产业周期:TCL电子持续繁荣的密码

作者 | 曾响铃 文 | 响铃说 1878年&#xff0c;爱迪生创立了爱迪生电灯公司&#xff0c;14年后&#xff0c;摩根将该公司与另外两家合并成通用电气公司&#xff08;GE&#xff09;。 从一个小小的碳丝直流电灯泡开始&#xff0c;历经数次改弦更张&#xff0c;穿越两次世界大…...

Elasticsearch:使用 ESRE 和生成式 AI 了解 TLS 日志错误

作者&#xff1a;DAVID HOPE 本博客介绍了 Elasticsearch 相关性引擎 (ESRE​​) 及其 Elastic Learned Sparse Encoder 功能的新颖应用&#xff0c;特别是在日志分析中。 最近发布的 Elasticsearch Relevance Engine™ (ESRE™) 包含一系列重要功能&#xff0c;可增强搜索能力…...

Swing程序设计(3)JDialog窗体

文章目录 前言一、JDialog窗体的介绍二、JDialog窗体的使用 1.JDialog的常用构造方法2.实例展示及分析总结 前言 JDialog窗体是窗体中的另一种类型的窗体&#xff0c;指对话框窗体。与JFrame窗体类似&#xff0c;绝大部分对于JFrame窗体使用的方法&#xff0c;对于JDialog窗体也…...

类和对象(1)

文章目录 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符和封装4.1访问限定符4.2封装 5.类的作用域6.类的实例化6.2结构体内存对齐规则 7.this指针7.2this指针的特性 封装&#xff08;补充&#xff09; 1.面向过程和面向对象初步认识 C面向对象但不纯面向…...

学会用命令行创建uni-app项目并用vscode开放项目

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 创建 uni-app 项目 命令行创建 uni-app 项目 编译和运行 uni-app 项目&#xff1a; 用 VS Code 开发 uni…...

java.lang.ClassCastException: android.os.BinderProxy cannot be cast to ...

项目开发遇到下面这个报错了&#xff01; 问题原因 直接说原因&#xff0c;就是因为进程间不能直接传递对象&#xff0c;应该传递该Binder对象的映射&#xff08;代理对象&#xff09;&#xff0c;所以类型转换就出错了。如果在同一个进程中&#xff0c;直接传递对象没有关系&a…...

AIGC(生成式AI)试用 3 -- 专业主题

何为专业&#xff1f; 主要研究某种学业或从事某种事业 我的理解可能是在某个方向、某个行业&#xff0c;专业的更靠谱、说了更算、表达的更晰&#xff0c;结果更有说服力 本次提问&#xff1a;你我的专业 生成式AI知道你我的专业吗&#xff1f;生成式AI如何诠释你…...

rsyslog-日志管理 logrotate-日志轮转

日志的管理的方式&#xff0c;以及怎么自己写一个管理日志的小脚本&#xff0c;其实也不能算脚本 管理日志的进程 rsyslogd&#xff1a;绝大部分日志记录&#xff0c;和系统操作有关&#xff0c;安全&#xff0c;认证sshd,su&#xff0c;计划任务at,cron… httpd/nginx/mysql: …...

类和对象续

目录 包 自定义包 包的访问权限控制 常见的包 Static成员 静态成员变量 静态成员方法 代码块 构造块 静态块 重写 继承 继承是啥&#xff1f; 父类成员访问 子类中访问父类成员变量 两者不同名 两者同名 子类中访问父类对的成员方法 super 子类构造方法 …...

SpringCloud:Feign实现微服务之间相互请求

文章目录 &#x1f389;欢迎来到Java学习路线专栏~SpringCloud&#xff1a;Feign实现微服务之间相互请求 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;Java学习路线&#x1f4dc;其他专栏&#xf…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式

简介 在我的 QT/C 开发工作中&#xff0c;合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式&#xff1a;工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...

[特殊字符] 手撸 Redis 互斥锁那些坑

&#x1f4d6; 手撸 Redis 互斥锁那些坑 最近搞业务遇到高并发下同一个 key 的互斥操作&#xff0c;想实现分布式环境下的互斥锁。于是私下顺手手撸了个基于 Redis 的简单互斥锁&#xff0c;也顺便跟 Redisson 的 RLock 机制对比了下&#xff0c;记录一波&#xff0c;别踩我踩过…...

Yii2项目自动向GitLab上报Bug

Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

java+webstock

maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...