【Linux】环境变量详解

Linux环境变量

    • 1.环境变量分类
    • 2.环境变量相关指令
    • 3.常用的环境变量
    • 4.环境变量的组织方式
    • 5.获取环境变量
    • 6.命令行参数

1.环境变量分类

  • 按生命周期划分:

    • 永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
    • 临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
  • 按作用域划分:

    • 系统环境变量:公共的,对全部的用户都生效。
    • 用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

2.环境变量相关指令

env:查看当前用户全部的环境变量
在这里插入图片描述

env | grep 环境变量名:筛选包含的环境变量

在这里插入图片描述

exprot :显示当前系统定义的所有的环境变量

在这里插入图片描述

printenv 环境变量名:查看指定环境变量的值

在这里插入图片描述

echo $环境变量名:查看指定环境变量的值

在这里插入图片描述

unset 环境变量名:清除指定环境变量

3.常用的环境变量

PATH

功能和作用

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。

书写格式

PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录。

export PATH=目录1:目录2:目录3:…目录n:.

PATH缺省包含Linux系统命令所在目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。

在这里插入图片描述

通过图可以看到,当PATH里没有了系统默认目录时,ls命令就不可直接使用了,必须要使用绝对路径才能使用,如下图:

在这里插入图片描述

想在PATH环境变量中增加其他的路径的方法:

export PATH = PATH:/其他的路径

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

普通用户和root用户的区别

在这里插入图片描述

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

在这里插入图片描述

4.环境变量的组织方式

在这里插入图片描述

每个程序都有一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

5.获取环境变量

main 函数的形参列表最多可以带有 3 个参数,分别为 argc 、 argv 、 envp :

int main(int argc,char* argv[],char* envp[]){}

其中 char* envp[] 是一个指针数组,该数组里面的指针都分别指向不同的字符串,并且最后一个指向有效字符串的指针的下一个指针一定指向 “NULL”,如下图:

在这里插入图片描述

下面编译一段代码:

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

结果:

在这里插入图片描述

发现这些指针指向的就是一个一个环境变量字符串。
讲到这里,我们的C/C++素养让我们意识到当函数传参数组时,传递的不是数组本身,而是数组首元素地址,所以在 main 函数的形参列表中写成的 char* envp[] 形式,本质上是一个二级指针,名为 environ ,查看一下 man 手册:

man environ

在这里插入图片描述

以后想要获取环境变量就可以通过遍历这个表状结构体获取了。
但是这样做的话太过于麻烦,为了方便起见,主流的获取环境变量的方法是通过函数获取,该函数名为 getenv 。
使用 man 手册查看该函数:

man getenv

在这里插入图片描述

用法就是:

getenv(环境变量名)

如下:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char*argv[],char*envp[])
{char*pwd=getenv("PWD");if(pwd==NULL)perror("getenv error");else printf("%s\n",pwd);return 0;
}

在这里插入图片描述

和预期结果一样。

补充:环境变量具有全局属性,可以被子进程继承。

在这里插入图片描述

通过上图我们可以发现,当使用export创建环境变量时,env指令可以查看到这个变量,而当直接创建环境变量时,env却不能查看到,只能用echo $环境变量名 查看,通过上面的现象可以发现,使用export 创建的环境变量被导入了环境表中,该变量称为全局环境变量。而直接创建没有被导入环境表,该变量称为本地环境变量

本地变量不能被子进程继承,在环境表中的全局环境变量可以被继承

为什么echo可以查看到本地变量?

echo属于内键命令,内建命令后面叫。

6.命令行参数

认识了main函数中的一个参数。其它两个也就非常容易理解了。

现在思考一个问题:为什么ls可以使用-a -l这些选项呢?

现在我们写一个程序测试一下我们能否也使用命令行参数吧

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

在这里插入图片描述

命令行参数的应用:

设计一个计算器

#include<stdio.h>
#include<string.h>
#include<stdlib.h>void Usage(const char* name)
{printf("\nUsage:%s -[+][-][*][/]\n\n",name);exit(-1);
}
int main(int argc,char* argv[],char* envp[])
{if(argc!=2) // 必须指定输入一个参数Usage(argv[0]);int n1 = 0;int n2 = 0;int ret = 0;printf("-----num1 = ");scanf("%d",&n1);printf("-----num2 = ");scanf("%d",&n2);if(strcmp(argv[1],"-+")==0) ret = n1 + n2;else if(strcmp(argv[1],"--")==0) ret = n1 - n2;else if(strcmp(argv[1],"-*")==0) ret = n1 * n2;else if(strcmp(argv[1],"-/")==0) ret = n1 / n2;printf("\n-----resault = %d\n",ret);return 0;
}

结果:

在这里插入图片描述
LInux环境变量的分享就到这了,如有错误还望支持,886!!!

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

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

相关文章

SpringBoot项目搭建IEDA2023.1.2

导入依赖 ——————————————————

L0G1000 Linux基础知识(包含ssh报错处理)

1.vscode通过ssh链接云服务器 按教程https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/linux 出现报错&#xff0c;是ssh配置原因 [23:40:18.788] Log Level: 2 [23:40:18.807] SSH Resolver called for “ssh-remotessh.intern-ai.org.cn”, attempt 1 [23:40:18.8…

使用 PyTorch-BigGraph 构建和部署大规模图嵌入的完整教程

当涉及到图数据时&#xff0c;复杂性是不可避免的。无论是社交网络中的庞大互联关系、像 Freebase 这样的知识图谱&#xff0c;还是推荐引擎中海量的数据量&#xff0c;处理如此规模的图数据都充满挑战。 尤其是当目标是生成能够准确捕捉这些关系本质的嵌入表示时&#xff0c;…

测试标题1111

前言 本文是该专栏的第68篇&#xff0c;后面会持续分享python爬虫干货知识&#xff0c;记得关注。 在本专栏之前&#xff0c;笔者有详细介绍京东滑块验证码的解决方法&#xff0c;感兴趣的同学&#xff0c;可以直接翻阅文章《Python如何解决“京东滑块验证码”(5)》进行查看。…

JDK8-17新特性

1.Java8新特性-Lambda表达式 2.1关于Java8新特性简介 Java 8是Java编程语言的一个重大版本更新&#xff0c;于2014年3月发布。它引入了许多新特性和改进&#xff0c;使得Java编程更加方便和高效。 下面是Java 8的主要新特性&#xff1a; Lambda表达式&#xff1a;Lambda表达式…

如何确保Python爬虫程序的稳定性和安全性?

在当今数字化时代&#xff0c;Python爬虫被广泛应用于数据采集和信息抓取。然而&#xff0c;确保爬虫程序的稳定性和安全性是开发过程中的重要考虑因素。本文将探讨如何通过技术手段和最佳实践来提高Python爬虫的稳定性和安全性&#xff0c;并提供代码示例。 稳定性保障 1. 异…

Axure二级菜单下拉交互实例

1.使用boxlabe进行基础布局 2.设置鼠标悬浮和选中状态 3.转换为动态面板 选中所有二级菜单,进行按钮组转换 选中所有二级菜单,进行动态面板转换 4.给用户管理增加显示/隐藏事件 1)选择toggle代表上拉和下拉切换加载 2)勾选Bring to Front,并选择Push/Pull Widgets代表收缩时…

基于智能推荐的图书电商系统的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

JavaScript实现Promise

第一步&#xff1a;编写constructor构造方法 const PENDING pending; const FULFILLED fulfilled; const REJECTED rejected;class MyPromise {#state PENDING;#result undefined;constructor(executor) {const resolve (data) > {this.#changeState(FULFILLED, data…

物理 + 人工智能 = 2024年诺贝尔物理学奖

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一、机器学习与神经网络的发展前景 二、机器学习和神经网络的研究与传统物理学的关系 结…

C++:异常

1. 异常的概念 C语言主要通过错误码的方式处理错误&#xff0c;错误码本质上就是对错误信息进行分类编号&#xff0c;拿到错误码以后还要去查询错误信息&#xff0c;比较麻烦。异常时抛出一个对象&#xff0c;这个对象可以涵盖更全面的信息。 异常处理机制允许程序中独立开发的…

南京邮电大学算法设计-二叉树先序遍历算法动态演示

二叉树先序遍历算法动态演示 一、课题内容和要求 (1)实验目的&#xff1a; 本实验通过手动输入二叉树结点信息&#xff0c;构建相应的二叉树&#xff0c;并通过图形化界面动态演示先序遍历算法的过程。通过本次实验&#xff0c;我可以深入理解二叉树的数据结构、先序遍历算法…

【开源免费】基于Vue和SpringBoot的在线考试系统(附论文)

本文项目编号 T 624 &#xff0c;文末自助获取源码 \color{red}{T624&#xff0c;文末自助获取源码} T624&#xff0c;文末自助获取源码 网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合&#xff0c;利用java技术建设在线考试系统&#xff0c;实现…

高阶C语言之六:程序环境和预处理

本文介绍程序的环境&#xff0c;在Linux下对编译链接理解&#xff0c;较为简短&#xff0c;着重在于编译的步骤。 C的环境 在ANSI C&#xff08;标准C语言&#xff09;的任何一种实现中&#xff0c;存在两个不同的环境。 翻译环境&#xff1a;在这个环境中&#xff0c;源代码…

HarmonyOs鸿蒙开发实战(10)=>状态管理-对象数组的属性数据变更刷新UI,基于@Observed 和@ObjectLink装饰器

1.条件:基于HarmonyOs5.0.0版本. 2.功能要求&#xff1a;横向列表中每个景点的名称&#xff08;eg: 第二项 “灵隐寺” &#xff09;, 在通过天气接口拿到对应天气后&#xff0c;拼接到名称后面 > 变成&#xff08;“灵隐寺” 天气&#xff09;&#xff09; 3.老规矩先看…

快速上手Mybatis Plus并速通MybatisPlus所有知识点

目录 一、简介 1.1 概况 1.2 特性 二、快速入门 1.建表 2.引依赖 3.application.ymal文件 4.定义mapper继承BaseMapper 5.总结 三、Mybatis Plus的使用 1.常见注解 1.1 TableName 1.2 TableId 1.3 TableField 2.常见配置 3.BaseMapper的基础CRUD方法 4.Wrapper…

使用代理解决前端跨域问题详解

目录 前言1. 什么是跨域问题&#xff1f;1.1 同源策略的定义1.2 跨域问题的表现 2. 解决跨域问题的常见方法3. 在 Vite 中配置代理解决跨域问题3.1 环境准备3.2 配置代理3.2.1 配置基础路径3.2.2 配置 Vite 代理3.2.3 参数解释 3.3 验证代理功能 4. 深入分析与注意事项4.1 代理…

使用MaxKB搭建知识库问答系统并接入个人网站(halo)

首发地址&#xff08;欢迎大家访问&#xff09;&#xff1a;使用MaxKB搭建知识库问答系统并接入个人网站 前言 从OpenAI推出ChatGPT到现在&#xff0c;大模型已经渗透到各行各业&#xff0c;大模型也逐渐趋于平民化&#xff1b;从最开始对其理解、生成、强大的知识积累的惊叹&…

查看台式机主机支持的最大分辨率 | 显卡和显示器

通过检查显卡规格和型号&#xff0c;确认主机支持最大分辨率。 方法1&#xff1a;设置 在设置 -> 系统 -> 屏幕 及其内的高级显示设置 设置 -> 显示 方法2&#xff1a;cmd 在运行中输入“devmgmt.msc”&#xff0c;进入设备管理器界面&#xff0c;点击展开“显示适配…

若依权限控制

springbootvue2项目中的权限控制(若依项目) 步骤: 1.登录管理员账号,为普通用户增加权限按钮 绿色部分为权限控制字符 2.在后端对应的方法上增加权限控制(这里以删除操作为例):PreAuthorize(“ss.hasPermi(‘area:store:remove’)”) 3.在前端对应的按钮上增加权限控制:v-ha…