Linux环境变量详解

文章目录

  • 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关键字进行声明,然后再使用。


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

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

相关文章

基于svpwm(羊角波)控制策略的二极管钳位型三电平逆变器双闭环simulink仿真

本人搭建了基于svpwm&#xff08;羊角波&#xff09;控制策略的二极管钳位型三电平逆变器双闭环simulink仿真模型&#xff0c;该模型按照三电平SVPWM理论生成羊角波&#xff0c;并搭建了双闭环控制系统。效果十分优异&#xff0c;配置参考文献&#xff0c;适合学习使用。 DC&a…

Music Star Studio

Music Star Studio资产包配有一个模块化音乐工作室、40多个游戏道具和完整的场景。 音乐之星工作室包括一个主舞台、一个评委舞台和一个观众座位。工作室是模块化的,您可以使用提供的建筑元素进一步设计您的工作室,如柱子、地板砖、墙砖、楼梯、围栏、舞台、玻璃墙、墙报等。…

C++进阶:红黑树介绍及模拟实现(图示详解过程)

C进阶&#xff1a;红黑树介绍及模拟实现 上次介绍了AVL树&#xff1a;C进阶&#xff1a;AVL树详解及模拟实现&#xff08;图示讲解旋转过程&#xff09; 今天就来紧接着来红黑树啦!!! 文章目录 1.红黑树介绍约束规则 2.项目文件规划3.整体框架&#xff08;节点和Tree&#xf…

从零开始:C++ String类的模拟实现

文章目录 引言1.类的基本结构2.构造函数和析构函数3.基本成员函数总结 引言 在C编程中&#xff0c;字符串操作是非常常见且重要的任务。标准库中的std::string类提供了丰富且强大的功能&#xff0c;使得字符串处理变得相对简单。然而&#xff0c;对于学习C的开发者来说&#x…

树莓派|串口通信协议

1、串口通信原理 串口通讯(Serial Communication)&#xff0c;是指外设和计算机间&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数据的一种通讯方式。串口是一种接口标准&#xff0c;它规定了接口的电气标准&#xff0c;没有规定接口插件电缆以及使用的协议。串…

霍廷格电源 Tru plasma DC3030 通快DC3040 MF3030

霍廷格电源 Tru plasma DC3030 通快DC3040 MF3030

谈谈 Spring 的过滤器和拦截器

前言 我们在进行 Web 应用开发时&#xff0c;时常需要对请求进行拦截或处理&#xff0c;故 Spring 为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢&#xff1f;本文将详细讲解两者的区别和对应的使用场景。 &#xff08;本文的代码实现首先是基于 Sprin…

【微命令】git config如何配置全局的用户和邮箱?(--global user.name、user.email;git config --help)

虽然经常用&#xff0c;也经常忘记&#xff0c;特此记录。 命令 git config --global user.name "myname" git config --global user.email test163.com另外一种方式 help git config --help |grep email | grep name直接help查看

OpenAI推出旗舰AI模型GPT-4o并免费开放

&#x1f989; AI新闻 &#x1f680; OpenAI推出旗舰AI模型GPT-4o并免费开放 摘要&#xff1a; OpenAI 未来的产品将以免费为优先&#xff0c;以让更多人使用为目标。OpenAI 发布了桌面版本的程序和更新后的 UI&#xff0c;更加简单自然。推出了新一代大模型 GPT-4o&#xf…

PLL-分频器

概念 分频器的性能一般用四个参数来规定:(1)分频比&#xff0c;(2)最大允许输入频率fmax&#xff0c;(3)功耗&#xff0c;(4)最小允许输入电压摆幅(也叫“灵敏度”)。虽然分频器的相位噪声也很重要&#xff0c;但在大多数情况下它可以忽略不计。 把一般分频器的输入灵敏度画成…

AI实景自动无人直播软件:引领直播新时代的智能化创作工具,实现一部手机24小时直播拓客

在科技飞速发展的今天&#xff0c;AI实景自动无人直播软件以其独特的功能和便捷性&#xff0c;正成为商家和内容创作者们的利器。这款先进的软件支持智能讲解、一键开播、智能回复以及手机拍摄真实场景等特性&#xff0c;为用户呈现了全新的直播体验&#xff0c;引领着直播行业…

K8s 二进制部署 上篇

一 K8S按装部署方式&#xff1a; ① Minikube Minikube是一个工具&#xff0c;可以在本地快速运行一个单节点微型K8S&#xff0c;仅用于学习、预览K8S的一些特 性使用。 部署地址&#xff1a;https://kubernetes.io/docs/setup/minikube ② Kubeadmin Kubeadmin也是一个工…

目标检测算法YOLOv6简介

YOLOv6由Chuyi Li等人于2022年提出&#xff0c;论文名为&#xff1a;《YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2209.02976 &#xff0c;项目网页&#xff1a;https://github.c…

深度学习设计模式之简单工厂模式

文章目录 前言一、简单工厂设计模式的作用&#xff1f;二、详细分析1.核心组成2.实现步骤3.示例代码4.优缺点优点缺点 5.使用场景 总结 前言 本文主要学习简单工厂设计模式&#xff0c;这个设计模式主要是将创建复杂对象的操作单独放到一个类中&#xff0c;这个类就是工厂类&a…

详述进程的地址空间

进程的地址空间 合法的地址 (可读或可写) 代码 (main, %rip 会从此处取出待执行的指令)&#xff0c;只读数据 (static int x)&#xff0c;读写堆栈 (int y)&#xff0c;读写运行时分配的内存 (???)&#xff0c;读写动态链接库 (???) 非法的地址 NULL&#xff0c;导致 se…

Gooxi发布最新AI服务器:加速生成式AI落地 更懂AI

近日&#xff0c;Gooxi发布最新训推一体AI服务器&#xff0c;以大容量内存和灵活的高速互连选项满足各种AI应用场景&#xff0c;最大可能支持扩展插槽&#xff0c;从而大幅提升智能算力性能&#xff0c;以最优的性能和成本为企业的模型训练推理落地应用提供更好的通用算力。 AI…

FSMC的NOR Flash/PSRAM 控制器功能介绍(STM32F4)

目录 概述 1 FSMC支持的类型 1.1 信号类型概述 1.2 FSMC的应用 2 外部存储器接口信号 2.1 I/O NOR Flash 2.2 PSRAM/SRAM 3 支持的存储器和事务 4 通用时序规则 5 NOR Flash/PSRAM 控制器异步事务 5.1 模式 1 - SRAM/PSRAM (CRAM) 5.2 模式 A - SRAM/PSRAM (CRAM…

GPU Burn测试指导

工具下载链接&#xff1a; https://codeload.github.com/wilicc/gpu-burn/zip/master测试方法&#xff1a; 上传工具到操作系统下&#xff0c;解压缩工具&#xff0c;使用make命令完成编译&#xff08;确保cuda环境变量已经配置成功、 nvcc -v能显示结果&#xff09;。 如果安…

图扑智慧农业——生态鱼塘数字孪生监控

智慧农业园作为新型农业经营模式&#xff0c;正在以其高效、环保、可持续的特点受到广泛关注。智慧鱼塘作为智慧农业中一项关键技术&#xff0c;结合物联网、人工智能、云计算等技术&#xff0c;实现对新型养殖模式的实时监控、优化与管理。 效果展示 图扑软件应用自研 HT for…

CVE-2024-4761 Chrome 的 JavaScript 引擎 V8 中的“越界写入”缺陷

分析 CVE-2024-4761 和 POC 代码 CVE-2024-4761 描述 CVE-2024-4761 是一个在 V8 引擎中发现的越界写漏洞&#xff0c;报告日期为 2024-05-09。这个漏洞可能允许攻击者通过特制的代码执行任意代码或者造成内存破坏&#xff0c;进而导致程序崩溃或其他不安全行为。 POC 代码解…