【Linux】环境变量

news2025/1/13 13:33:25

文章目录

  • 一.什么是环境变量
  • 二.常见的环境变量
    • 1.常见的环境变量和与之相关的命令
    • 2.PATH指定命令搜索路径
    • 3.env显示所有环境变量
    • 4.echo查看环境变量
  • 三.本地变量与环境变量的联系
  • 四.获取环境变量的三种方式
    • 1.getenv()函数获取环境变量
    • 2.利用命令行参数
    • 3.利用第三方变量


一.什么是环境变量

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

二.常见的环境变量

我们先了解一下这些环境变量大概是什么,还有与环境变量相关的命令有什么,然后再详解每个环境变量。(ps:windows操作系统下–高级系统设置中也能查找到环境变量)

1.常见的环境变量和与之相关的命令

  • 常见环境变量
  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
  • SHELL:当前Shell,它的值通常是/bin/base
  • 环境变量相关的命令
  • echo:查看某个环境变量的值
  • export:设置一个新的环境变量
  • env:显示所有环境变量
  • unset:清除环境变量
  • set:显示本地定义的shell变量和环境变量

2.PATH指定命令搜索路径

在Linux下,如果我们要执行一个可执行程序,输入的命令是:./a.out,那么实际上a.out也是一个命令,但是我们在命令行直接输入a.out,程序不能被执行。那么问题来了,为什么有些指令可以不用带路径就直接执行,而我们的二进制程序需要带路径才能执行呢?

因为环境变量PATH中没有我们这个命令的搜索路径,操作系统不能直接搜索到,解决方法就是将我们程序所在的路径加入到环境变量PATH当中。下面将对其进行演示:将会用到echo,export命令。

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

3.env显示所有环境变量

下面是一些常见环境变量。

◆ HISTSIZE是指保存历史命令记录的条数。

◆ LOGNAME是指当前用户的登录名。

◆ HOSTNAME是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。

◆ SHELL是指当前用户用的是哪种Shell。

◆ LANG/LANGUGE是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。

◆ MAIL是指当前用户的邮件存放目录。

◆ PS1是基本提示符,对于root用户是#,对于普通用户是$。PS2是附属提示符,默认是">"。可以通过修改此环境变量来修改当前的命令符,比 如下列命令会将提示符修改成字符串"Hello,My NewPrompt "。

PS1=" Hello,My NewPrompt "

除了这些常见的环境变量,许多应用程序在安装时也会增加 一些环境变量,比如使用Java就要设置JAVA_HOME和CLASSPATH等,而安装五笔输入法会增加环境变量"XMODIFIERS=@im=fcitx"等。
在这里插入图片描述

4.echo查看环境变量

注意环境变量前一定要加$符号
在这里插入图片描述
在这里插入图片描述

三.本地变量与环境变量的联系

那么了解了常见的环境变量之后,我们来看看本地变量与环境变量有什么区别与联系。

1.在下图中,我们在命令行上定义了一个变量myval,然后我们通过echo指令去查看这个变量的值,也能查看到,值为123,但是当我们用env查找时发现,没有找到这个环境变量。那么实际上myval就是一个本地变量。
在这里插入图片描述
2.那么如何将本地变量导成环境变量呢?—利用export命令,设置新的环境变量,这时利用env就能查看到我们已把这个本地变量设置成了环境变量
在这里插入图片描述
3.set查看本地变量,unset取消环境变量
在这里插入图片描述

环境变量,或者称为全局变量,存在与所有的shell中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了。Linux的环境变量具有继承性,即子shell会继承父shell的环境变量,并且本地变量只在当前进程(base)内有效。本地变量不会被子进程所继承。

四.获取环境变量的三种方式

1.getenv()函数获取环境变量

getenv()函数
1.头文件<stdlib.h>
2.函数声明如下:
char* getenv(const char* name)
3.函数名称解析:get:获取,env:nvironment Variable 环境变量,合起来就是获取环境变量
4.参数与返回值:参数是我们要获取的环境变量名称的字符串,如果该环境变量不存在,则返回NULL,如果所要查找的环境变量存在,则返回char*。即字符串,也就是所获取到的环境变量的值(环境变量是操作系统的全局变量,实际上是个字符串)。

实例演示:如何使用getenv()函数
这是在家目录下的nan用户下,写的一份代码
在这里插入图片描述
当我们执行这份代码,获取到了环境变量USER,当前用户是nan
在这里插入图片描述

当我su - 切换到root用户下,再到我们的家目录下执行这份代码,会发现这个代码程序帮我获取到了环境变量USER,当前的用户是root
在这里插入图片描述
那么USER环境变量最大的意义就是:可以标识当前的使用Linux用户。
我们知道我们使用某些指令时,得到的结果是Permission denied,即我们没有这个权限使用某些指令,例如我们想cd到家目录下的某一用户(当前用户非root),就会出现这样的警告,结论:很多命令都存在身份认证这一环节,就是通过USER环境变量去操作的。我们用代码也可以简单实现。
在这里插入图片描述

2.利用命令行参数

首先我们先得理解什么是命令行参数

(1)C语言的main函数通常含有参数argc和argv,写法通常如下:

int main(int argc,char *argv[])
int main(int argc,char **environ[])

argc : 命令行传入参数的总个数
argv : *argv[]是一个指针数组,里面存放的指针指向所有的命令行参数,argv[0]指向程序的全局路径,argv[1]指向在DOS命令行中执行程序名后的第一个字符串,argv[2]指向第二个。

(2)我们来看在Linux下的一段代码:
在这里插入图片描述
执行结果:
在这里插入图片描述
(3)解析:实际上我们在命令行上输入的命令,是一个长字符串,例如:
“ls -a -d”,那么它们会被分隔成小的子串,即"ls" “-a” “-d”,然后被存放在char* argv[]这个指针数组中,argc就是子串的个数

(4)那么命令行参数在Linux中存在的意义是什么呢?有什么用途呢?
我们来看以下代码:(这里只显示了代码主干内容,头文件及其它不表)xia
执行结果:
在这里插入图片描述

从这个代码可以得知,我们在命令行上使用的命令,命令行选项,跟argc(命令行参数个数),char* argv[ ]指针数组中存的命令子串息息相关。所以知道了这一点之后,我们也可以给我们的的程序带上命令行选项,不同的选项实现该程序不同的功能。

(5)最后我们引出这个,命令行参数获取环境变量的方法、
在这里插入图片描述

在这里插入图片描述

3.利用第三方变量

那么如果我们就是不想用main函数的参数进行获取环境变量,那么我们还有一个解决方法:C语言定义了一个environ变量,它是全局的环境变量的指针,char** environ,变量是一个char** 类型,存储着系统的环境变量。

使用方法:

  • 头文件:unistd.h
  • 因为environ是一个全局的外部变量,所以切记使用前要用extern关键字进行声明,然后在使用。
#include <stdio.h>
 
extern char ** environ;
 
int main()
{
    char ** envir = environ;
    
    while(*envir)
    {
        fprintf(stdout,"%s",*envir);
        envir++;
    }
    return 0;
}

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

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

相关文章

如何校准Linux服务器时间

最近服务器上的时间与北京时间出现偏差&#xff0c;而Java代码里java.util.Date获取的是服务器时间&#xff0c;导致当前时间错误。 Linux查看服务器当前时间 查看当前时区&#xff1a;date -R 查看当前日期和时间&#xff1a;date 校准Linux服务器时间 Linux中有个ntp包可…

【Unity】URP渲染管线下代码获取相机的Volume Mask属性

步骤1. 引用URP的命名空间2. 获取摄像机3.通过URP扩展获取Volume Mask属性附 层级的相关代码Reference1. 引用URP的命名空间 using UnityEngine.Rendering.Universal;2. 获取摄像机 这里可以使用公有拖拽或者私有赋值的方式。 如果使用拖拽&#xff0c;则&#xff1a; publi…

神经网络和深度学习-多分类问题Softmax Classifier

多分类问题Softmax Classifier 在之前做糖尿病数据集的时候做的二分类问题&#xff0c;因为只有两类&#xff0c;所以只需要输出一个概率值&#xff0c;另一个概率值用1去减去就可以得到 实际上在大多数数据集中是在处理一个多分类问题&#xff0c;例如MNIST中有10类标签 神经…

Hifiasm-meta | 你没看错!基于宏基因组的完成图!!

哈佛大学医学院Dana-Farber癌症研究所李恒课题组重磅推出三代HiFi宏基因组组装软件——hifiasm-meta。研究论文“Metagenome assembly of high-fidelity long reads with hifiasm-meta”预印本在线发布。 宏基因组样本的do novo组装是研究微生物群落的常用方法。与单个物种的组…

RNA-seq 详细教程:分析准备(3)

学习目标 了解 RNA-seq 和差异表达基因的分析流程了解如何设计实验了解如何使用 R 语言进行数据分析1. 简介 在过去的十年中&#xff0c;RNA-seq 已成为转录组差异表达基因和 mRNA 可变剪切分析不可或缺的技术。正确识别哪些基因或转录本在特定条件下的表达情况&#xff0c;是理…

【FreeRTOS(四)】显示任务详细信息

文章目录显示任务详细信息 vTaskList代码示例显示任务详细信息 vTaskList 通过 vTaskList来协助分析操作系统当前 task 状态&#xff0c;以帮助优化内存&#xff0c;帮助定位栈溢出问题。 void vTaskList( char *pcWriteBuffer );parameterdescriptionpcWriteBuffer保存任务状态…

11.21~11.28日学习总结

首先这一周&#xff0c;主要进行的几个事情。 1.在星期一~星期二图书报账的相关事情处理已经完毕&#xff0c;记录了现在图书报账的相关流程&#xff0c;比以前的流程有不少改变&#xff0c;已经写了word记录了流程&#xff0c;给下一任图书管理员做参考。 2.进行了项目的中期…

mysql集群的主从复制搭建

1.master上和slave分别安装好mysql&#xff08;5.7&#xff09; 2.按照下面的方式进行安装 3.安装完成后&#xff0c;进行初始化&#xff0c;并找到默认的密码进行登录 4.设置为开机自&#xff0c;并检查状态 5.进行登录&#xff0c;用root账户&#xff0c;密码为生成的那个密码…

C++:STL之Vector实现

vector各函数 #include<iostream> #include<vector> using namespace std;namespace lz {//模拟实现vectortemplate<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;//默认成员函数vector(); …

SpringBoot项目如何引入外部jar及将外部jar打包到项目发布jar包

1、创建一个SpringBoot项目 下载项目之后将项目导入IDEA 2、如何添加外部jar包 准备一个外部的jar包&#xff0c; 我这里使用的是guava-31.1-jre.jar作为演示 下载地址&#xff1a;https://repo1.maven.org/maven2/com/google/guava/guava/31.1-jre/guava-31.1-jre.jar 在项…

黎曼的几何基础,维度

黎曼的几何基础&#xff0c;让数学领先物理100年&#xff0c;维度是人类最大的障碍 - 知乎 高斯很早就有了“高维几何”的想法&#xff0c;他曾经向他的同事们说起假想完全生活在二维表面上的“书虫”&#xff0c;并想要把这推广到高维空间的几何学中去。然而&#xff0c;由于害…

Java安全编码规范之Web安全漏洞

Java安全编码规范之Web安全漏洞安全现状漏洞案例事件一事件二事件三安全编码规范之常见的安全漏洞敏感数据编码概述漏洞危害常见关键字举例解决方案代码硬编码秘钥错误示例日志打印导致的敏感信息泄露漏洞概述关键字举例解决方案代码中在日志打印token 错误示例文件上传漏洞概述…

CSDN客诉周报第12期|修复10个重大bug,解决29个次要bug,采纳1个用户建议

听用户心声&#xff0c;解用户之需。hello&#xff0c;大家好&#xff0c;这里是《CSDN客诉周报》第12期&#xff0c;接下来就请大家一同回顾我们最近几周解决的bug&#xff5e; 一、重大问题 1、【博客】主页无法访问 反馈量&#xff1a;80 发生时间&#xff1a;10月30日下…

外汇天眼:Axi收回在RGT Capital的全部控制权,Eurotrader获得FCA牌照

在过去的一周里&#xff0c;国外外汇市场上有哪些值得关注的新闻&#xff0c;跟着天眼君一起了解下吧~具体新闻如下&#xff1a; 1、Axi收回在RGT Capital的全部控制权 据天眼君了解&#xff0c;总部位于澳大利亚的零售外汇和差价合约经纪商Axi在澳大利亚投资公司RGT Capital的…

AutoDL使用手册

官网&#xff1a;AutoDL-品质GPU租用平台-租GPU就上AutoDL 1.服务器购买 2.新建虚拟环境 conda create -n tf python3.8 # 构建一个虚拟环境&#xff0c;名为&#xff1a;tf conda init bash && source /root/.bashrc # 更新bashrc中的环境变量 conda acti…

【Flink】使用水位线实现热门商品排行以及Flink如何处理迟到元素

文章目录一 WaterMark1 水位线特点总结2 实时热门商品【重点】&#xff08;1&#xff09;数据集&#xff08;2&#xff09;实现思路a 分流 - 开窗 - 聚合分流&#xff1a;开窗&#xff1a;聚合&#xff1a;b 再分流 -- 统计再分流&#xff1a;统计&#xff1a;&#xff08;3&am…

【Hack The Box】Linux练习-- Seventeen

HTB 学习笔记 【Hack The Box】Linux练习-- Seventeen &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年9月7日&#x1f334; &#x1f…

SpringBoot结合Liquibase实现数据库变更管理

《从零打造项目》系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 SpringBoot集成MybatisPlus项目实操 SpringBoot集成Spring Data JPA项目实操 数据库变更管理 数据库变更管理&#xff1a;Li…

[附源码]Python计算机毕业设计Django的党务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

行为型模式-命令模式

package per.mjn.pattern.command;import java.util.HashMap; import java.util.Map;// 订单类 public class Order {// 餐桌号码private int diningTable;// 点的餐品和份数private Map<String, Integer> foodDir new HashMap<>();public int getDiningTable() {…