Linux环境变量详解

news2025/2/23 18:39:50

文章目录

  • 1. 前言
  • 2 什么是PATH环境变量
  • 3. 如何添加PATH环境变量
  • 4. 系统中的其他环境变量
  • 5. 环境变量的由来
  • 6. 环境变量的基本操作
    • 6.1 设置环境变量
    • 6.2 通过getenv获取环境变量
    • 6.3 环境变量的应用场景
  • 7. 通过命令行参数获取环境变量


1. 前言

本篇文章将以PATH环境变量为例来对整个Linux环境变量进行学习理解。

本文着重讲解了什么是PATH环境变量、如何添加PATH环境变量、系统中的其他环境变量、环境变量的由来、环境变量的基本操作以及命令行参数中环境变量的体现。

2 什么是PATH环境变量

Linux中的各种指令本质上是/usr/bin/目录下的一个个可执行程序,和我们自己编写的可执行程序没有任何区别:

在这里插入图片描述

但是我们发现,执行我们自己的程序时需要指定路径,但是执行Linux中的各种指令却不需要指定路径:

在这里插入图片描述

这是因为系统中存在PATH环境变量,PATH中存放着这些指令的地址。当我们使用这些指令时,系统会自动去PATH中寻找对应指令,如果找到了就执行,找不到就报错command not found

3. 如何添加PATH环境变量

我们可以使用echo $PATH来查看PATH环境变量中包含的内容:

在这里插入图片描述

注:PATH中不同路径之间用:分割。

我们也可以通过向PATH中添加内容来让我们自己的程序可以不需要指定路径就能被执行

==法一:==直接将程序添加到/usr/bin/目录下(不建议使用这种方法,因为我们写的程序没有经过测试,容易污染指令池)。

在这里插入图片描述

==法二:==使用export命令将当前可执行程序的路径导入到PATH中。

在这里插入图片描述

法二相关说明:

  1. 其中的$PATH代表之前PATH中内容,:之后的为新添加的内容。注意不要直接export PATH=/home/czh/practice,这样会把之前的PATH覆盖掉,使得Linux中的各种指令必须指定路径使用。
  2. PATH中不能由空格,因为Linux中以空格为分隔符。
  3. 使用export命令声明,变量只在**当前的shell(BASH)或其子shell(BASH)**下是有效的,在关闭shell后失效,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

4. 系统中的其他环境变量

PATH环境变量只是系统中众多环境变量的一种,除了PATH,我们还有许多其他环境变量,且不同的环境变量有不同的功能,也适用于不同的场景,比如:

  • HOSTNAME:主机名
  • USER:当前用户名
  • PWD:当前系统路径
  • HOME:当前用户的家目录
  • HISTSIZE:shell能记忆的最多历史命令的条数

在这里插入图片描述

我们可以使用env命令来查看系统中所有的环境变量:

在这里插入图片描述

5. 环境变量的由来

ls -al /home/czh可以发现家目录下存在两个隐藏文件.bash_profile.bashrc

在这里插入图片描述

实际上,当我们在登录shell时,操作系统会让我们当前的shell进程执.bash_profile中的内容,而.bash_profile又会调用执行.bashrc,它们会将对应的环境变量导入到shell进程的上下文环境中。所以,如果我们上面不小心将$PATH覆盖掉了也不用担心,重新登录shell就好了。

至此,环境变量的定义如下:

环境变量是操作系统为了满足不同的应用场景,预先在系统内设置的一大批全局变量,这些变量往往具有特殊功能,且能够一直被bash以及bash的子进程访问。

注:环境变量具有全局属性的根本原因是环境变量会被子进程继承。

6. 环境变量的基本操作

6.1 设置环境变量

Linux命令行其实是可以定义变量的,但是以这种方式定义出来的变量是本地变量,即只在bash进程中有效,而不是环境变量,因为环境变量具有全局属性:

在这里插入图片描述

我们可以使用export直接定义环境变量,也可以使用它将已存在的本地变量导为环境变量:

在这里插入图片描述

我们可以使用set命令来查看所有变量,包括环境变量和本地变量;使用 unset 来取消变量,包括环境变量和本地变量:

在这里插入图片描述

6.2 通过getenv获取环境变量

我们可以使用echo $环境变量名来获取特定的环境变量,也可以通过getenv()函数来获取环境变量:

在这里插入图片描述

其中name是我们要获取的环境变量的名称,如果获取成功就返回该环境变量的具体内容,失败就返回null

有了getenv函数后,我们就可以自己编写系统中的某些指令了,比如pwd

#include <stdio.h>
#include <stdlib.h>

#define MYPWD "PWD"

int main()
{
    char* env = getenv(MYPWD);
    printf("%s\n", env);
    return 0;
}

在这里插入图片描述

6.3 环境变量的应用场景

我们上面提到,环境变量是操作系统为了满足不同的应用场景,预先在系统内设置的一大批全局变量。其中PATH是为了满足我们指令路径搜索的需求,而除了指令需求之外还有许多其他需求,其中非常重要的一个就是身份认证

我们以一个例子说明:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define USER "USER"

int main()
{
    char* who = getenv(USER);
    if(strcmp(who, "root") == 0)
    {
        printf("Operation success!\n");
    }
    else 
    {
        printf("Permission denied!\n");
    }
    return 0;
}

在这里插入图片描述

注:这里要使用su -,而不能使用su,因为su -会重新登录shell,此时shell会重新加载环境变量,让$USERczh变为root,而su只是把用户身份切换为root

我们可以在程序内部通过getenv函数来获取当前的Linux用户,然后判断其是否具备某种权限,再执行对应操作,另外,我们还可以通过stat来获取一个文件的其他属性,比如读写执行等,然后根据这些属性判断一个用户是否能对该文件进行操作:

在这里插入图片描述

7. 通过命令行参数获取环境变量

我们上面提到,程序可以通过getenv函数来获取环境变量,其实除了getenv函数,程序还可以通过命令行参数传递来获取环境变量。

学过C语言的同学应该都知道,main函数其实是有参数的,且这些参数通过命令行传递:

int main(int argc, char* argv[], char* env[]);

其中argv是一个指针数组,数组里面的每一个元素都指向一个字符串,argc用来指定数组元素的个数;它们配合使用可以实现类似于ls -a -l -d选项的功能。

而指针数组env就是用于接受父进程传递过来环境变量的参数,我们可以通过在main函数中打印env中的内容来验证它:

#include <stdio.h>
#include <stdlib.h>

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

在这里插入图片描述

程序也可以通过环境表environ来获取环境变量

环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串,每个进程都会收到一张环境表:

在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[], char* env[])
{
    extern char** environ;
    int i = 0;
    for(i=0; environ[i]; i++)
    {
        printf("%d:%s\n", i, environ[i]);
    }
    return 0;
}

在这里插入图片描述

注:environ是一个全局的外部变量,所以切记使用前要用extern关键字进行声明,然后再使用。


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

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

相关文章

CSP备考---位运算

前言 本期我们将学习位运算&#xff0c;与本期类型的考点&#xff08;二进制转换&#xff09;反码、补码、原码。 1、位运算是什么 首先我们需要先了解位运算是什么。 我们知道&#xff0c;计算机中的数在内存中都是以二进制形式进行存储的 &#xff0c;而位运算就是直接对整…

J-STAGE (日本电子科学与技术信息集成)数据库介绍及文献下载

J-STAGE (日本电子科学与技术信息集成)是日本学术出版物的平台。它由日本科学技术振兴机构&#xff08;JST&#xff09;开发和管理。该系统不仅包括期刊&#xff0c;还有论文集&#xff0c;研究报告、技术报告等。文献多为英文&#xff0c;少数为日文。目前网站上所发布的内容来…

通过windows远程桌面,远程连接CentOS系统

1.配置阿里云的YUM仓库 1.1 备份当前的YUM仓库配置文件 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup1.2 下载阿里云的CentOS仓库配置文件 对于CentOS 7&#xff1a; sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirr…

Java RMI反序列化总结篇-01

1.java rmi反序列化 RMI 允许一个应用程序访问另外一个服务器或虚拟机上的对象&#xff0c;方法和服务&#xff0c;它使远程方法调用就像在本地调用一样简单。它为用户屏蔽了底层的网络传输细节&#xff0c;使用的时候只需适当处理异常即可。所以 RMI 是非常容易使用的&#x…

uniapp开发安卓app使用文字转语音技术

在 UniApp 开发安卓应用时&#xff0c;要实现文字转语音&#xff08;Text-to-Speech, TTS&#xff09;技术&#xff0c;你可以利用 UniApp 的跨平台能力结合原生模块或第三方服务来实现。以下是一些建议的步骤和方法&#xff1a; 1. 使用 UniApp 原生模块&#xff08;如果支持…

Linux中的磁盘分析工具ncdu

2024年5月14日&#xff0c;周二上午 概述 ncdu 是一个基于文本的用户界面磁盘使用情况分析工具。它可以在终端中快速扫描目录&#xff0c;并统计该目录下的文件和文件夹的磁盘使用情况&#xff0c;以交互友好的方式呈现给用户。 安装 在 Debian/Ubuntu 系统下&#xff0c;可…

Linux的命名管道 共享内存 信号量

目录 命名管道 mkfifo函数 unlink函数 命名管道类 服务端 客户端 共享内存 shmget函数 ftok函数 key和shmid的区别 snprintf函数 ipcs指令 ipcrm指令 shmctl函数 shmat函数 void*做返回值 创建共享内存空间 服务端 客户端 信号量 命名管道 基本概念&a…

Unity使用sherpa-onnx实现离线语音合成

sherpa-onnx https://github.com/k2-fsa/sherpa-onnx 相关dll和lib库拷进Unity&#xff0c;官方示例代码稍作修改 using SherpaOnnx; using System; using System.IO; using System.Runtime.InteropServices; using UnityEngine;public class TTS : MonoBehaviour {public st…

基于java 自定义注解Annotation设计简单ORM框架——进阶篇

目录 引言实例新建两个注解标注实体类拼接sql语句 总结 引言 一般Java规范编程&#xff08;只是一种习惯&#xff0c;而不是强制&#xff09;中&#xff0c;变量的命名方式一般采用驼峰式命名。比如userName&#xff0c;userImage。但是在数据库中一般不会采用驼峰式&#xff…

工业物联网解决方案:机房动环监控系统

工业物联网解决方案&#xff1a;机房动环监控系统 工业物联网&#xff08;IIoT&#xff09;作为数字化转型的关键驱动力&#xff0c;正深刻改变着各行各业的运作模式&#xff0c;其中机房动环监控系统是实现智能化运维管理的重要组成部分。该系统通过集成传感器技术、大数据分…

位图(c++)

文章目录 1.位图概念2.位图的实现3.应用&#xff08;解决整形存在或次数问题&#xff09;3.1存在问题3.2次数问题 5.搜索的方法对比&#xff1a; 1.位图概念 和哈希一样&#xff0c;都是一个表来记录某个元素的个数或者存在与否&#xff1b;不同的是哈希使用的计算机定义的完整…

跨境必看|TikTok账号运营的八大秘籍

国内的传统生意都是可以在抖音上做&#xff0c;那么也可以在TikTok 上重新做一遍。那该如何才能把握住这片巨大的蓝海&#xff0c;TikTok 账号的运营就成为了主要的关键了&#xff0c;对于TikTok账号运营的八大秘籍&#xff0c;大家一起看看是如何做的&#xff1f; 一、固定节…

部署管理征信链码

一 . 链码准备 需要删除上面后面标记的文件&#xff0c;之后拖入 二. 打包链码 注意需要先启动链 打包测试链码 export FABRIC_CFG_PATH${PWD}/config peer lifecycle chaincode package ./chaincode/chaincode_basic.tar.gz --path ./chaincode/credit_chaincode --lang n…

VMware虚拟机安装详细教程

VMware下载安装好后&#xff0c;下载好我们要安装的操作系统的镜像文件后&#xff0c;此处安装的为centos7版本&#xff0c;就可以开始安装了。 1点击下一步 image 2、勾选【我接受条件款协议中的条款】&#xff0c;然后点击【下一步】。 image 3、取消勾选&#xff0c;然后点…

【瑞萨RA6M3】1. 基于 vscode 搭建开发环境(后续)

编译 mkdir build cd build cmake .. -G"Unix Makefiles" make -j或者 cmake -Bbuild -G"Unix Makefiles" cmake --build build创建快捷指令&#xff1a; 删除 .vscode/tasks.json&#xff0c; 存储占用和生成 MAP 编译完成后&#xff0c;打印内存占用…

大数据可视化实验(五):Tableau数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;打开数据源... 1 2&#xff09;进入工作簿... 2 3&#xff09;字段设置... 2 4&#xff09;数据筛选... 3 5&#xff09;绘制条形图... 3 四、思考问题... 4 五、总结与心得体会... 4 一、…

04-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容 上一节《03-单片机商业项目编程&#xff0c;从零搭建低功耗系统设计-CSDN博客》我们确定了设计思路&#xff0c;并如何更有效的保持低功耗&#xff0c;这节我们就准备来做软件框架设计。在AI飞速发展的时代&#xff0c;我们也会利AI来辅助我们完成&#xff0c;让自…

【Image captioning】In Defense of Grid Features for Visual Question Answering实现流程

In Defense of Grid Features for Visual Question Answering实现流程 网格特征预训练代码 这是该论文的特征预训练代码发布: @InProceedings{jiang2020defense,title={In Defense of Grid Features for Visual Question Answering},author={Jiang, Huaizu and Misra, Ishan…

机器学习实战宝典:用scikit-learn打造智能应用

书接上文——《数据探险家的终极指南&#xff1a;用Python挖掘机器学习的奥秘》 前文我们在这段精彩的机器学习探险之旅中&#xff0c;从基础概念出发&#xff0c;深入探索了使用Python和scikit-learn库进行数据分析和模型构建的全过程。 我们首先了解了机器学习的基本原理&am…

通义千问 1.5 -7B fine-tune验证

尝试对对中文数据进行finetune验证&#xff0c;测试模型的可优化方向。下面是代码的详细情况 代码实现 from datasets import load_dataset from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,HfArgumentParser,AutoTokenizer,TrainingArgum…