Linux中的环境变量

news2024/11/13 10:54:04

一、基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。

  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

二、获取和修改环境变量

命令:env。可以获取系统中全部的环境变量。

image-20240715161045701

可以看到环境变量是非常多的,理解几个重要的。

USER=csj

解释:当前登录的用户名。

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/csj/.local/bin:/home/csj/bin

解释:可执行文件的目录路径列表。

HOME=/home/csj

解释:用户登录目录路径(也就是家目录)。

PWD=/home/csj

解释:当前工作目录。


当我们登录普通用户的时候和登录root用户的时候,pwd怎么就知道我们在哪个目录下?

image-20240715162749731

image-20240715162850669

登录的时候:

  • 输入用户名和密码
  • 认证
  • 形成环境变量(肯定不止一个,PATH,PWD,HOME)
  • 根据用户初始化HOME=/root或者HOME=/home/xxx
  • cd $HOME

就这样不同用户登录的时候,它的家目录都是确定好的。

三、PATH环境变量

命令echo $PATH查看PATH环境变量。

image-20240715201242166

以冒号分割。

PATH环境变量是一个非常重要的环境变量。

它用于指定操作系统在执行命令时搜索可执行文件的目录路径列表。

比如ls命令,它不在当前的工作目录下,但是我们可以直接使用呢?原因就是ls是环境变量/usr/bin下的一个可执行文件。

image-20240715201907887


在windows系统中也是一样的,环境变量也是有大作用的,比如我们可以将QQ的路径添加到PATH环境变量中,使用cmd命令也可以打开QQ。

image-20240715202459006

image-20240715202534296

也是一样,在cmd运行框中,虽然qq的路径不在该路径下,但是一样可以运行,这就是PATH环境变量的作用,由此可见,PATH环境变量是具有全局性的。


运行可执行程序,需要加上./,表明在当前路径下,我们可以将该可执行程序路径加入到PATH中去,就可以实现直接使用可执行程序。

添加路径到PATH中去,命令:PATH:$PATH:路径

image-20240715204601566

还可以PATH=“”,将PATH直接置为空。注意这里所有修改PATH的做法都是临时性的,它是在内存中实现的,当你重启xshell后,环境变量又会重置(因为.bash_profile文件并没有修改)。

image-20240715205142156

可以发现,PATH置为空之后,很多命令是无法运行的,但是pwd却可以运行,这与后面说的内建命令有关!

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

通过代码如何获取环境变量

①命令行第三个参数

main函数的前两个参数叫做命令行参数,那main函数还有第三个参数吗?其实是有的,叫做环境变量参数。

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

image-20240715210126661

通过main函数第三个参数,同样可以得到环境变量。

②通过第三方变量environ获取
#include<stdio.h>      
int main()      
{      
    extern char**environ;      
    int i=0;      
    for(;environ[i];i++)      
    {      
        printf("%s\n",environ[i]);      
    }                                                                           
    return 0;      
}

image-20240715210651706

通过系统调用获取或设置环境变量

③getenv访问特定的环境变量

image-20240715210738744

#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("%s\n",getenv("PATH"));
    printf("%s\n",getenv("SHELL"));
    return 0;
}

image-20240715211141658

五、配置文件

系统启动我们的程序的时候,可以选择给我们的进程(main)提供两张表:命令行参数表和环境变量表

命令行启动的进程都是shell/bash的子进程,子进程的命令行参数和环境变量是父进程传给我们的!

比如我们可以使用fork创建子进程:

#include<stdio.h>
#include<unistd.h>
int main()
{
    pid_t id=fork();
    if(id==0)
    {
        extern char**environ;
        int i=0;
        for(;environ[i];i++)
        {
            printf("%d:%s\n",i,environ[i]);
        }
    }
    return 0;
}

image-20240715234842126

再次验证了环境变量具有全局性!!!


那shell/bash的进程的命令行参数和环境变量又从哪里来呢?

在用户的家目录~下有一个文件隐藏文件:.bash_profile

环境变量的信息就是以脚本配置文件的形式存在在.bash_profile中的。

image-20240715231449878

image-20240715231544502

总结:每一次登录的时候,bash进程都会读取该文件中的内容,形成自己的环境变量信息!

六、本地变量vs环境变量

我们是可以自己定义环境变量的,和环境变量的格式一样,左边大写,中间等于,右边为变量值。

比如:MYENV_109=hellolinux!

image-20240716160612015

虽然echo可以显示出内容,但是显然我们的程序是读取不到该环境变量,环境变量表中并没有添加上该环境变量。

这样的环境变量叫做本地变量。

要将本地变量导入到环境变量表中去,使用命令export+本地变量。

image-20240716161000433

这样虽然导入到了环境变量表中,但是这是在内存中的,它是临时性的,当我们重新登录后,该环境变量又不在了。

刚刚我们说了,环境变量表信息是从文件.bash_profile中来的,需要永久保存我们自己定义的环境变量,就需要修改该文件的内容。

image-20240716162238140

在该文件中导入自己定义的环境变量,需要使得环境变量生效,需要重新登录一下,使得bash重新读取该文件。

image-20240716162301286


总结

本地变量:只在bash进程内部有效,不会被子进程继承下去。

环境变量:通过让所有的子进程继承的方式,实现自身的全局性!

这里就有个问题了,本地变量使用echo可以显示出来,但是我们自己写的程序,也就是bash的子进程,就没法看到本地变量。

echo同样是bash创建的子进程啊,说了本地变量只能在bash进程内部有效哇,和子进程无关哒,好奇怪哦。

其实这里就是我们下面要说的!!!

七、常规命令和内建命令

linux命令分类:

①常规命令,shell fork创建出的子进程。

②内建命令,shell命令行的一个函数,当然可以直接读取shell内部定义的本地变量咯。

显然echo就是一个内建命令!!!

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

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

相关文章

Guava LocalCache源码分析:LocalCache的get、put、expand、refresh、remove、clear、cleanUp

Guava LocalCache源码分析&#xff1a;LocalCache的get、put、expand 前言一、get二、put三、expand 前言 上篇文章&#xff0c;详细描写了Guava LocalCache怎样如ConcurrentHashMap对缓存数据进行了分段存储。本章主要针对LocalCache重要的几个接口进行说明。 一、get CanIg…

[笔记]Fluke3563 振动分析仪

参考文档&#xff1a;Fluke 3563 Analysis Vibration Sensor system | Fluke 1.四大机械故障损伤原因 2.振动特征 福禄克做的示意图很棒&#xff1a; 不平衡对应转动轴的一倍频&#xff0c;不对中是2倍频&#xff0c;然后3~6倍频会有未紧固故障&#xff0c;更高频的位置是齿轮…

怎么压缩视频文件?简单的压缩视频方法分享

视频已成为我们日常生活中不可或缺的一部分。但随着视频质量的提高&#xff0c;文件大小也逐渐成为我们分享的阻碍。如何有效压缩视频文件&#xff0c;使其既能保持清晰&#xff0c;又能轻松分享&#xff1f;今天&#xff0c;给大家分享五种实用的视频压缩方法&#xff0c;快来…

ubuntu上模拟串口通信

前言 有时候写了一些串口相关的程序&#xff0c;需要调试的时候&#xff0c;又没有硬件&#xff0c;或者需要等其他模块完成才能一起联调。这样搭建环境费时费力&#xff0c;很多问题等到最后联调才发现就已经很晚了。 本文提供一种在ubuntu环境下模拟串口&#xff0c;直接就可…

性价比高的宠物空气净化器什么牌子好?热门养宠空气净化器分享

作为一名有6年经验的铲屎官&#xff0c;许多新手铲屎官可能听说过宠物空气净化器&#xff0c;但了解不多。实际上&#xff0c;宠物空气净化器是养猫家庭必备的小家电之一。它的大面积进风口能有效吸附空气中的浮毛和皮屑&#xff0c;专门的除臭技术可以去除猫咪带来的异味。宠物…

Python 视频水印批量添加器

功能如下可以 一、选择水印位置 二、批量添加水印 三、可添加文本或图片 # -*- 编码&#xff1a;utf-8 -*- import cv2 import os import numpy as np from moviepy.editor import VideoFileClip from concurrent.futures import ThreadPoolExecutor import tkinter as tk fro…

【深度学习】FaceChain-SuDe,免训练,AI换脸

https://arxiv.org/abs/2403.06775 FaceChain-SuDe: Building Derived Class to Inherit Category Attributes for One-shot Subject-Driven Generation 摘要 最近&#xff0c;基于主体驱动的生成技术由于其个性化文本到图像生成的能力&#xff0c;受到了广泛关注。典型的研…

PostgreSQL使用(二)

说明&#xff1a;本文介绍PostgreSQL的DML语言&#xff1b; 插入数据 -- 1.全字段插入&#xff0c;字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入&#xff0c;字段名必须写全 insert into tb_student (id, name) values (2,…

分享3个好用的启动盘u盘制作工具

对于经常需要安装维护电脑的同学&#xff0c;制作一个可启动的U盘是非常有必要的。小编今天就和大家分享三款优秀的U盘启动盘制作工具&#xff1a;Ventoy、UltraISO和Rufus。 1. Ventoy Ventoy是一款开源的启动U盘制作工具&#xff0c;它支持将ISO、WIM、IMG、VHD(x)和EFI等类…

SpringMVC 控制层框架-上

一、SpringMVC简介 1. 介绍 Spring Web MVC 是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring Framework 中。在控制层框架经历Srust、WebWork、Strust2等诸多产品的历代更迭之后&#xff0c;目前业界普遍选择了SpringMVC 作为Java EE项目表述层开发的首…

如何通过网络快速搜寻到自己的STM32设备

目录 一、问题概述 二、解决思路 三、代码实现 1.创建任务 2.UDP广播接收 一、问题概述 以前一直用RS232串口修改设备配置信息&#xff0c;但是现场施工人员的232线太细&#xff0c;经常容易断掉&#xff0c;这次准备用网口去修改&#xff0c;遇到了一个问题&#xff0c;…

WINUI或WPF灵活使用样式、控件模板、自定义控件、用户控件

在WINUI与WPF 中&#xff0c;控件模板&#xff08;ControlTemplate&#xff09;、样式&#xff08;Style&#xff09;、自定义控件&#xff08;CustomControl&#xff09;和用户控件&#xff08;UserControl&#xff09;都是构建复杂和灵活用户界面的重要工具&#xff0c;但它们…

vue3 中 lottie-web 封装组件

用到的JSON文件在“我的资源”里&#xff0c;下面这个链接直达 下面的代码中用到的JSON数据源 Lottie.vue <script setup> import { ref, onMounted } from vue import lottie from lottie-web// 设置组件参数 const props defineProps({renderer: {type: String,def…

手把手带你白嫖10年服务器

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 手把手带你白嫖10年服务器 如何获取如何使用成果个人网站 个人邮箱服务 重要的话重要说&#xff…

Ubuntu部署K8S集群-图文并茂(超详细)

Ubuntu部署K8S集群 1. 模版机系统环境准备1.1 安装Ubuntu1.2 设置静态IP地址 2. 主机准备2.1 使用模板机创建主机2.2 主机配置2.2.1 修改静态IP2.2.2 修改主机名2.2.3 主机名-IP地址解析2.2.4 时间同步2.2.5 内核转发、网桥过滤配置2.2.6 安装ipset和ipvsadm2.2.7 关闭SWAP分区…

【射频器件供应】Flann Microwave

国家 United Kingdom 地址 Flann Microwave Ltd Dunmere Road Bodmin, Cornwall PL31 2QL United Kingdom Flann Microwave于1956年成立于泰晤士河畔金斯顿萨里。在过去的四十年里&#xff0c;Flann Microwave一直是市场领先的天线设计公司&#xff0c;其精密微波器件和测试频…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【获取密钥属性(ArkTS)】

获取密钥属性(ArkTS) HUKS提供了接口供业务获取指定密钥的相关属性。在获取指定密钥属性前&#xff0c;需要确保已在HUKS中生成或导入持久化存储的密钥。 开发步骤 指定待查询的密钥别名keyAlias&#xff0c;密钥别名最大长度为64字节。调用接口[getKeyItemProperties]&…

Qt类 | QAbstractButton类详解

文章目录 一、QAbstractButton类介绍二、Properties&#xff08;属性&#xff09;三、Public Functions&#xff08;公共函数&#xff09;1.构造函数2.autoExclusive与setAutoExclusive函数--获取/设置自动互斥状态3.autoRepeat与setAutoRepeat函数--获取/设置自动重复状态4.au…

Magic Insert的奇特功能

当然可以&#xff01;让我为你详细介绍一下 Magic Insert 这个有趣的项目。 Magic Insert 是一个基于 AI 技术的创意工具&#xff0c;它允许我们从一张图像中提取一个主题&#xff0c;并将其以不同风格插入到另一张图像中&#xff0c;使得插入效果既符合目标图像的风格&#x…

Arduino呼吸灯

本次学习的内容 1、信号的输入与输出以及信号的分类。 2、理解数字信号与模拟信号以及它们的区别。 3、学会通过模拟输出的方式完成灯的呼吸效果。 Arduino中信号的分类 模拟信号|数字信号 模拟信号&#xff1a;是指用连续变化的物理量所表达的信息&#xff0c;如温度、湿…