[Linux]环境变量

一.什么是环境变量

为了满足不同的运行场景,操作系统预先设置了一大批全局变量,这种可以指定操作系统运行环境的变量就是环境变量。

我们平常使用的指令本质上也是用C语言实现的一个个小程序,但是我们在执行我们自己的可执行程序时往往是类似这样的:./test这个意思是告诉操作系统我要执行的是当前路径下的test文件(执行一个文件首先要找到这个文件)。

使用系统指令的时候不需要带./的原因就是环境变量PATH中存放系统的默认搜索路径,我们的可执行程序不能直接执行,是因为可执行程序的路径不在PATH中。

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

存放指令的路径是usr/bin

1.让我们自己的程序不用带路径

a.将我们的文件放入指令池

执行ls等程序时不需要带路径是因为环境变量PATH中存放了系统的默认搜索路径,那如果我不想让我的程序在执行是带路径就只要将我的程序放入到系统的默认搜索路径中即可。
在这里插入图片描述

这里要使用sudo权限,因为拷贝在Linux就等同于安装

不建议这样,因为我们写的代码没有经过测试,直接放到系统的指令池中会将其污染

使用sudo rm /usr/bin/mytest在系统指令路径下删掉我们自己的程序

在这里插入图片描述

b.增添环境变量PATH

可以在环境变量PATH中加入我们的当前路径,这样我们的当前路径也就变成了系统的默认搜索路径。既可以不污染指令池又可以让我们的程序不带路径。

细节管们已经发现了在环境变量PATH中,路径之间是以:间隔的,所以在添加新路径的时候要在旧路径后面写:+路径

在这里插入图片描述

echo PATH=路径的方法是错误的,会将PATH中原本存在的值给覆盖掉

在这里插入图片描述

此时你再使用ls命令,它会告诉你command not found。这是因为它不会默认的再去usr/bin路径下查找了。

如果你不慎这么操作了,也没关系你只需要关掉服务器再重新启动一次,这个PATH就又会被加载成最初的模样了。

在这里插入图片描述

etc/bashrc这个文件中存放的就是各种环境变量,每当我们启动一次,这个加载操作就会被执行。


二.环境变量相关的指令

1.set:显示本地的shell变量和环境变量

2.unset:取消环境变量

3.export:将本地变量设置成环境变量

所谓的本地变量就是我们直接在bash上定义的变量,这样的变量是本地变量只在当前进程(bash)有效,不可以被子进程继承而环境变量可以被子进程所继承

在这里插入图片描述

4.env:显示所有的环境变量

在这里插入图片描述

系统之所以能知道我当前的路径是因为有个环境变量叫PWD,系统之所以能判断我有没有权限是因为有个环境变量叫USER,sudo就是将USER变量改成了root所以我就有了root权限。

5.echo:显示某个环境变量的值(echo+$变量名甚至可以查到本地变量)


三.获取环境变量

如果你想在程序中显示某个环境变量,就可以使用getenv这个系统调用函数来获取

在这里插入图片描述

可以看到它的参数是字符指针,也就是说环境变量其实都是字符串

在这里插入图片描述

因为不同用户的环境变量不同,所以结果也不同。下面我切换到root用户再执行一次这个路径的这个程序,一起来看看结果

在这里插入图片描述

实现pwd指令

既然环境变量中有一个PWD,而我现在又有了拿到环境变量的getenv函数,所以实现pwd命令对我们来说简直是有手就行。

#include <stdio.h>
#include <stdlib.h>
#define MYPWD "PWD"
int main()
{
    char* p=getenv(MYPWD);
    printf("%s",p);
    return 0;

在这里插入图片描述

你还可以将这个命令放到默认搜索路径下,以后这个程序就是你的另一个pwd指令

四.命令行参数

main函数也是可以有参数的(最多可以有3个),接下来我们首先看一个现象

在这里插入图片描述

如果gcc版本比较低就要主动声明一下-std=c99,否则不能支持c99标准中的某些写法

好奇怪我们打印argv数组中的内容时拿到的确实我们的可执行程序名以及我们带的选项。

所以我们可以得到这样的一个结论:命令行输入的命令其实是一个大字符串,这个字符串会被拆开然后按顺序传给argv数组

在使用指令的时候,我们不但可以单独使用指令,还可以使用指令带选项的方式,就是因为命令行的前两个参数。

int main()
{
	if(argc != 2)
    {
        printf("Usage: \n\t%s [-a/-b/-c/-ab/-bc/-ac/-abc]\n", argv[0]);
        return 1;
    }
    if(strcmp("-a", argv[1]) == 0)
    {
        printf("功能a\n");
    }
    if(strcmp("-b", argv[1]) == 0)
    {
        printf("功能b\n");
    }
    if(strcmp("-c", argv[1]) == 0)
    {
        printf("功能c\n");
    }
    if(strcmp("-ab", argv[1]) == 0)
    {
        printf("功能ab\n");
    }
    if(strcmp("-bc", argv[1]) == 0)
    {
        printf("功能bc\n");
    }
    return 0;
}

指令的设计就是使用这种方式,在函数中对输入指令进行判断,再执行对应指令。无非就是使用C语言对具体功能进行封装。


接下来我再将第三个参数放进来:

在这里插入图片描述

在C语言中,指针类的参数一般都是以空指针作为结尾的。

可以看到直接就拿到了整个环境变量,这和在命令行输入env命令是一样的。

此外还可以通过environ拿到环境变量:

在这里插入图片描述

environ是系统中的一个全局的二级指针,它指向命令行参数表,作为参数传递给char* env[]。environ没有包含在任何头文件中,所以在使用时 要用extern声明。

在这里插入图片描述


我们平常也不用environ,但是程序也总能拿到环境变量是因为:环境变量本身是被加载到物理内存再映射到进程地址空间的,所以即使程序不去主动的获取环境变量,那些环境变量也被加载到虚拟内存中了。

五.总结

总之环境变量就是操作系统预先设在的一大批全局变量,当我们在启动计算机时这些全局变量就会加载到内存中可以指定计算机的运行环境。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go调用docker远程API(二)-docker API 的容器操作

文章目录1 获取容器列表2 查看指定容器信息3. 查看容器日志4 创建容器4.1 简单使用4.1.1 语法4.1.2 完整示例4.2 端口映射4.2.1 语法4.2.2 完整示例4.3 挂载本机目录/文件4.3.1 语法4.3.2 完整代码5. 启动容器6 停止容器7 删除&#xff08;已停止的&#xff09;容器8 进入容器执…

线程池的7种创建方式

文章目录普通方式创建线程存在的问题什么是线程池线程池的好处线程池设计思路线程池相关类的继承关系线程池的创建方式固定容量线程池——FixedThreadPool相关构造方法示例运行结果缓存线程池——CachedThreadPool相关构造方法示例运行结果单线程线程池——SingleThreadExecuto…

关于国产化系统银河麒麟(Kylin)的问题记录--持续更新

kylin 镜像 &#xff1a; Kylin-Server-10-SP2-x86-Release-Build09-20210524 Kylin-Server-10-SP1-Release-Build20-20210518-x86_64 1.ansible 模块无法使用yum 报错&#xff1a;"msg": "The Python 2 bindings for rpm are needed for this module. If you r…

Dart语言操作符?和!的用法

一.基本使用 1. ? 操作符跟在类型后面&#xff0c;表示当前变量可为null。 int a null; //这句代码在有空安全时&#xff0c;编译会提示错误如果想给一个变量赋值null要如何处理呢&#xff1f;只需要在类型 后面添加操作符&#xff1f;即可&#xff0c;eg: int? a null…

UWB高精度定位系统源码,工业安全定位系统源码

基于VueSpring boot前后端分离架构开发的一套UWB高精度定位系统源码。有演示。 文末获取联系 系统采用UWB高精度定位技术&#xff0c;可实现厘米级别定位。UWB作为一种高速率、低功耗、高容量的新兴无线局域定位技术&#xff0c;目前应用主要聚焦在室内外精确定位。在工业自动化…

spring boot 实现根据用户名查找用户功能

目录 1、UserEnetity类 2、UserMapper类 3、UserService类 4、UserController类 5、postman测试结果 为了实现根据用户名查询用户功能&#xff0c;我们需要在spring boot框架当中编写一下几个类&#xff1a; 1、UserEnetity类 它是根据数据库表的实体类&#xff0c;用于…

Downie 4 4.6.13 MAC上最好的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器&#xff0c;可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的站点&…

蓝桥杯第19天(Python)(疯狂刷题第2天)

题型&#xff1a; 1.思维题/杂题&#xff1a;数学公式&#xff0c;分析题意&#xff0c;找规律 2.BFS/DFS&#xff1a;广搜&#xff08;递归实现&#xff09;&#xff0c;深搜&#xff08;deque实现&#xff09; 3.简单数论&#xff1a;模&#xff0c;素数&#xff08;只需要…

国产ARM+FPGA架构在“能源电力”中的典型应用详解

能源电力作为国民经济发展的“先导产业”和“基础行业”,面对当今复杂多变的国际形势,国内能源电力企业为追求更高的自主可控,正不断寻求各种经过行业验证的国产方案。 而单ARM架构已很难应对能源电力多通道/高速AD数据采集、处理、存储和显示的应用场景。目前,ARM + FPGA异…

Linux系统-gunzip命令简介以及常用参数

命令 – 解压提取文件内容 gzip命令 gzip命令是一种数据压缩方式&#xff0c;它是在Linux操作系统中常用的一种压缩工具&#xff0c;是GNU项目中自带的压缩程序之一。它是采用Lempel-Ziv编码(LZ77)和哈夫曼编码(Huffman Coding)进行压缩数据的&#xff0c;被广泛应用于软件发…

用Qt编写STM32烧录软件(ISP模式)代码

1.前言 之前写了一篇【用Qt编写STM32烧录软件&#xff08;ISP模式&#xff09;】&#xff0c;但是在文中没有具体的实现代码。 现在补上&#xff0c;各位有兴趣的同学可以参考以下。但是代码里面还有很多没有完善的&#xff0c;必定会存在一些bug&#xff0c;目前只是堪堪能用…

redis-数据结构、io

1.redis 数据结构 1.1 字典 kv是什么 每个键值对都会是一个dictEntry set hello word为例&#xff0c;因为Redis是KV键值对的数据库&#xff0c;每个键值对都会有一个dictEntry(源码位置&#xff1a;dict.h) 简单描述 加载原理 server 启动&#xff0c;加载redisdb进内存形…

厉害了!Facebook优惠广告让你的广告预算翻倍

如果你是一个企业主或者市场营销人员&#xff0c;你可能已经知道Facebook广告平台是一个强大的数字广告工具&#xff0c;可以帮助你推广产品和服务&#xff0c;并且吸引潜在客户到你的网站上。 而今天&#xff0c;我们将教你如何创建和投放Facebook优惠广告以及如何利用这些广…

【Redis学习】Redis事务

理论简介 是什么 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞。 能干嘛 一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令 Redis事务 V…

花3个月面过华为测开岗,拿个30K不过分吧?真不是凡尔赛。。。

背景介绍 美本计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实…

Apsara Clouder阿里巴巴开发规范认证

apsara n. 飞天&#xff1b;阿普萨拉 俗话说&#xff1a;“没有规矩&#xff0c;不成方圆。”今天我们来介绍一下&#xff0c;阿里巴巴对于开发规范的考试认证。 报名地址&#xff1a; https://edu.aliyun.com/certification/cldt04 1.证书 我们先来看一下考试通过的证书&…

vue 实现左滑图片验证

前言 众所周知&#xff0c;网页中滑动图片验证一直是各大网站、移动端的主流校验方式&#xff0c;其主要作用是为了区分人和机器以及为了防止机器人程序暴力登录或攻击从而设置的一种安全保护方式。从开发的角度来看要想实现这个功能还是需要一点时间的&#xff0c;但其实网上已…

C++源码剖析——forward_list

前言&#xff1a;之前看过侯老师的《STL源码剖析》但是那已经是多年以前的&#xff0c;现在工作中有时候查问题和崩溃都需要了解实际工作中使用到的STL的实现。因此计划把STL的源码再过一遍。   摘要&#xff1a;本文描述了llvm中libcxx的forward_list的实现。   关键字&am…

【排序算法】排序算法介绍及插入排序 ( 直接插入排序 希尔排序 )

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1.排序的概念和运用1…

关于Warning: World-writable config file ‘/etc/mysql/my.cnf‘ is ignored

不知道那个大兄弟&#xff0c;更改了my.cnf的权限为 0777 登陆mysqll的时候提示&#xff1a;Warning: World-writable config file /etc/mysql/my.cnf is ignored 里面的配置被忽略了, my.cnf不起作用 如果不是安装在docker里面的话&#xff0c;直接 chmod 0644 /etc/mysql/…
最新文章