《Linux从练气到飞升》No.15 Linux 环境变量

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux
菜鸟刷题集

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

文章目录

    • 前言
    • 基本概念
    • 常见环境变量
    • 查看环境变量方法
    • 测试PATH
    • 测试HOME
    • 和环境变量相关的命令
    • 环境变量的组织方式
    • 如何通过代码获取环境变量?
    • 后记

前言

在我们使用Linux命令时,我们会发现。我们执行命令并不需要带上路径,但是为什么我们自己写的C语言程序,需要带上路径。我们怎么把我们的程序可以做得像Linux的命令一样,直接输入就可以执行呢?本篇将回答这些问题,并讲述相关的概念。

基本概念

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

  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash。

查看环境变量方法

echo $NAME //NAME:你的环境变量名称

测试PATH

测试代码:

#include <stdio.h>    int main(int argc, char *argv[],char *env[]) {   printf("hello world!\n");   return 0;   
}   

对比一下./hello执行和直接hello执行

在这里插入图片描述
为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序需要带路径才能执行?

比如说:ls

在这里插入图片描述

因为他一定在这些目录下面:

在这里插入图片描述
这些指令比如说ls pwd等都可以直接运行因为,它会直接在环境变量下搜索该命令的路径,然后执行程序。而我们自己写的程序并不在 PATH中,就不能不带路径直接执行。

我们可以怎样让我们的程序像Linux的指令一样呢?

  1. 把我们的程序放到PATH的路径下,但是我们并不推荐这种做法,因为它会污染别人的命令池。我们这种做法相当于安装。
  2. 将我们的程序的路径放到环境变量里
export PATH=$PATH:[hello的路径]

在这里插入图片描述
这样我们就可以直接运行程序,而不用带上路径了。

测试HOME

  • root普通用户,分别执行echo $HOME对比差异
    在这里插入图片描述

  • 执行 cd ~ pwd ,对应 ~ HOME 的关系
    在这里插入图片描述

和环境变量相关的命令

  1. echo: 显示某个环境变量值
    在这里插入图片描述

  2. export: 设置一个新的环境变量

export PATH=$PATH:[hello的路径]

在这里插入图片描述
3. env: 显示所有环境变量
在这里插入图片描述

  1. unset: 清除环境变量
  2. set: 显示本地定义的shell变量和环境变量
    在这里插入图片描述

环境变量的组织方式

在这里插入图片描述
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

如何通过代码获取环境变量?

  • 命令行第三个参数
    在我们上面的hello.c程序中,我们会发现main函数有三个参数与我们之前所见括号内无参有一些区别。但事实上他们是一样的。我们接下来依次讲述三个参数的作用。
#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;
}

首先我们看一下env的作用。

看一下运行结果:
在这里插入图片描述
我们发现它就是我们之前在命令行输入env命令时所展示的环境变量。

那么我们现在就知道它的作用了,每一个进程启动的时候,启动该进程传递给它的环境变量信息都由这个参数传导进来。

谁导入的环境变量?
答案是通过从父进程那里继承下来的。默认情况下,所有的环境变量都会被子进程继承,环境变量具有全局属性,但是所有的父进程都有它的父进程,最终的父进程就是bash。bash的环境变量从哪来呢?操作系统?

#include <stdio.h>
#include <stdlib.h>
int main()
{
char * env = getenv("MYENV");
if(env){
printf("%s\n", env);
}
return 0;
}

直接查看,发现没有结果,说明该环境变量根本不存在

  • 导出环境变量 export MYENV="hello world"
  • 再次运行程序,发现结果有了!说明:环境变量是可以被子进程继承下去的!

**还有什么获取环境变量的方式吗?**有的(environ、getenv函数等)
通过第三方变量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声明。

我们再来看第1和第2个参数。

测试代码如下:

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

测试结果:
在这里插入图片描述

argv[0]:"./hello"
argv[1]:"-ls"
argv[2]:"-a"
argv[3]:"-b"

我们会发现argv存储启动程序的选项。

命令行参数最大的意义是让我们同样一个程序通过选项的方式可以使用同一个程序的不同的子功能,这就是选项的意义,即这些所有的命令后面所带,选项底层都是用命令行参数完成的。

后记

本篇我们主要讲述了什么是环境变量以及怎么设置环境变量?还有查看环境变量的方法。与环境变量相关的命令,环境变量的组织方式。最后还讲述了如何通过代码来获取环境变量。

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

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

相关文章

微信小程序通用字体代码

下面是一个简单的微信小程序通用字体代码示例&#xff1a; // 在app.wxss中设置全局字体样式 import ./styles/fonts.wxss;// 在fonts.wxss中定义字体样式 font-face {font-family: CustomFont;src: url(font.ttf) format(truetype); }// 在page.wxss中使用自定义字体样式 .cus…

SASS 学习笔记 II

SASS 学习笔记 II 上篇笔记&#xff0c;SASS 学习笔记 中包含&#xff1a; 配置 变量 嵌套 这里加一个扩展&#xff0c;嵌套中有一个 & 的用法&#xff0c;使用 & 可以指代当前 block 中的 selector&#xff0c;后面可以追加其他的选择器。如当前的 scope 是 form&a…

GuLi商城-前端基础Vue-使用Vue脚手架进行模块化开发

自己亲自实践&#xff1a; mac安装webpack webpack 简介Webpack 是一个非常流行的前端构建工具&#xff0c;它可以将多个模块&#xff08;包括CSS、JavaScript、图片等&#xff09;打包成一个或多个静态资源文件&#xff08;bundle&#xff09;&#xff0c;以便用于部署到生产…

19c_ogg搭建

1.环境介绍 源端&#xff1a;192.168.56.101 目标端&#xff1a;192.168.56.100 背景&#xff1a;数据从主库cdb主机定位&#xff0c;同步到从库 2.配置ogg 2.1 开启归档、强制日志、补充日志 --ogg 主备都需要配置 SQL> alter database archivelog; SQL> alter databa…

【Axure高保真原型】JS日期选择器筛选中继器表格

今天和大家分享JS日期选择器筛选中继器表格的原型模板&#xff0c;通过调用浏览器的日期选择器&#xff0c;所以可以获取真实的日历效果&#xff0c;具体包括哪一年二月份有29天&#xff0c;几号对应星期几&#xff0c;都是真实的&#xff0c;获取日期值后&#xff0c;通过交互…

接口测试,负载测试,并发测试,压力测试区别

接口测试 1.定义&#xff1a;接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 2.目的&#xf…

原型与继承

原型与继承 在 JavaScript 中&#xff0c;对象有一个特殊的隐藏属性 [[Prototype]]&#xff08;如规范中所命名的&#xff09;&#xff0c;它要么为 null&#xff0c;要么就是对另一个对象的引用。该对象被称为“原型。 当我们从 object 中读取一个缺失的属性时&#xff0c;Jav…

使用Julia实现A*路径寻找算法:一个深入的指南

第一部分&#xff1a;简介与背景 1. 引言 Julia&#xff0c;作为一种高效、灵活且易于学习的编程语言&#xff0c;逐渐在科学计算、数据分析和机器学习等领域中占据一席之地。当我们谈到路径规划或游戏开发时&#xff0c;A_算法&#xff08;A Star Algorithm&#xff09;常常…

什么是变量提升(hoisting)?它在JavaScript中是如何工作的?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 变量提升&#xff08;Hoisting&#xff09;⭐ 变量提升的示例&#xff1a;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&…

7.3 C/C++ 实现顺序栈

顺序栈是一种基于数组实现的栈结构&#xff0c;它的数据元素存储在一段连续的内存空间中。在顺序栈中&#xff0c;栈顶元素的下标是固定的&#xff0c;而栈底元素的下标则随着入栈和出栈操作的进行而变化。通常&#xff0c;我们把栈底位置设置在数组空间的起始处&#xff0c;这…

C++11并发与多线程笔记(9) async、future、packaged_task、promise

C11并发与多线程笔记&#xff08;9&#xff09; async、future、packaged_task、promise 1、std::async、std::future创建后台任务并返回值2、std::packaged_task&#xff1a;打包任务&#xff0c;把任务包装起来3、std::promise3、小结 1、std::async、std::future创建后台任务…

C++友元函数和友元类

友元 1.友元介绍2.类友元2.1示例代码 3.函数友元3.1示例代码 4.总结 1.友元介绍 在C中&#xff0c;友元&#xff08;friend&#xff09;是一种机制&#xff0c;允许某个类或函数访问其他类的私有成员。通过友元&#xff0c;可以授予其他类或函数对该类的私有成员的访问权限。友…

哈工大开源“活字”对话大模型

一、介绍 大规模语言模型&#xff08;LLM&#xff09;在自然语言处理的通用领域已取得了令人瞩目的成功。对于广泛的应用场景&#xff0c;这种技术展示了强大的潜力&#xff0c;学术界和工业界的兴趣也持续升温。哈工大自然语言处理研究所30余位老师和学生参与开发了通用对话大…

re学习(35)攻防世界-no-strings-attached(动调)

参考文章&#xff1a;re学习笔记&#xff08;28&#xff09;攻防世界-re-no-strings-attached_Forgo7ten的博客-CSDN博客 攻防世界逆向入门题之no-strings-attached_攻防世界 no-strings-attached_沐一 林的博客-CSDN博客 本人题解&#xff1a; 扔入Exepeinfo中查壳和其他信息…

LVS-DR模型实例

一、LVS-DR集群介绍 LVS-DR&#xff08;Linux Virtual Server Director Server&#xff09;工作模式&#xff0c;是生产环境中最常用的一 种工作模式。 1、LVS-DR 工作原理 LVS-DR 模式&#xff0c;Director Server 作为群集的访问入口&#xff0c;不作为网关使用&#xff0…

python+django+mysql项目实践五(信息搜索)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 信息搜素 输入内容进行搜索,内容有文本类和时间类 文本类需要模糊搜索,包含即检索 时间类需要选取时间范围内的内容 views 利用Q完成对指定内容的检索 检索后按检索内容更新…

HarmonyOS/OpenHarmony应用开发-ArkTS语言渲染控制ForEach循环渲染

ForEach基于数组类型数据执行循环渲染。说明&#xff0c;从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 一、接口描述 ForEach(arr: any[], itemGenerator: (item: any, index?: number) > void,keyGenerator?: (item: any, index?: number) > stri…

网络综合布线实训室建设方案

一、网络综合布线系统概述 网络综合布线系统是为了满足数据通信需求而设计和建立的一套基础设施。它提供了数据传输、信号传输和电力供应的基础结构&#xff0c;支持各种网络设备和终端设备之间的连接。 网络综合布线系统通常包括以下组成部分&#xff1a; 1&#xff09; 数据…

面试题 17.10 主要元素

​​题目来源&#xff1a; leetcode题目&#xff0c;网址&#xff1a;面试题 17.10. 主要元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 首先&#xff0c;顺序遍历数组&#xff0c;将不同的数字消去&#xff0c;最后留下的数字若计数小于等于 0&#xff…

ZooKeeper集群服务器启动

在本文中&#xff0c;我们将对集群版ZooKeeper服务器的启动过程做详细讲解。集群和单机ZooKeeper服务器的启动过程在很多地方都是一致的&#xff0c;因此本节只会对有差异的地方展开进行讲解。下图所示是集群版ZooKeeper服务器的启动流程图。 预启动 预启动的步骤如下。 (1)统…