【Linux_】环境变量

news2024/9/29 3:24:03

【Linux_】环境变量

  • 心有所向,日复一日,必有精进
  • 专栏:《Linux_》
  • 作者:沂沐沐


 目录

【Linux_】环境变量

 什么是环境变量

常见变量

查看环境变量方法

环境变量相关的命令

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

环境变量通常是具有全局属性的 

导出环境变量

删除自定义环境变量

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

命令行参数表 : argv[]   

​编辑 环境变量表 : env[]

通过第三方变量environ获取环境变量


 什么是环境变量

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

常见变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash。

查看环境变量方法

  • echo $NAME //NAME:你的环境变量名称

例如:

echo $PATH

环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

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

putenv - change or add an environment variable

getenv - get an environment variable

USER这个环境变量表示登录用户名;

#include <stdlib.h>

char *getenv(const char*name )

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

#define USER "USER"

int main(){
        char*  who = getenv (USER);
        printf("user: %s\n",who);
        return 0;
}

当切换登录用户为text时再次运行程序:

 

 这样我们是不是就能判断是那个用户?如果是root用户就会给相对应的权限;

环境变量通常是具有全局属性的 

我们可以自己设置环境变量

但是我们发现在env中查找的时候却没有找到?

这是因为我们当前定义的变量为本地变量有点像局部变量。 

        ——本地变量只会在当前进程中生效;

我们稍微改进一点程序用来查找一下:

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

#define MY_ENV "myval"
int main(){
    char *myenv = getenv(MY_ENV);
    if(myenv!=NULL){
    printf("%s\n",myenv);
    }else{
        printf("noy found  \n");
    }
    return 0;
}

怎么才能让我们的变量进入全局变量呢?

导出环境变量

export myval="12345"

再次运行程序,发现结果有了!

——bash就是一个系统进程,mycmd运行后也就是这个系统进程的子进程

 说明:环境变量是可以被子进程继承下去的!想想为什么?

为了不同的应用场景,我们需要子进程继承,比如上面我们举例了USER来进行身份验证; 

如果我们不想通过上述方式,想直接查找到自己定义的本地变量;

 set: 显示本地定义的shell变量和环境变量

set里面东西可是真的多;set即显示shell的环境变量又显示本地变量;

 

删除自定义环境变量

unset: 清除环境变量..231

 

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

众所周知,main函数也是有参数的 

#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{
    //argv[]==命令行参数表;
    //env[]==环境变量表
    return 0;
}

命令行参数表 : argv[]
   

#include<stdio.h>

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

 

在命令行中,例如:

  ls    -a -b -c -l
//命令  选项

 当我们在命令行输入指令时,我们系统会做出如下动作:

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

//mycmd -a -b -c
int main(int argc,char*argv[]){
    if(argc!=2){
        printf("usage : \n\t%s [-a/-b/-c] \n",argv[0]);
        return 1;
    }
    if(strcmp("-a",argv[1])==0){
      printf("功能a\n");
    }
    if(strcmp("-b",argv[1])==0){
      printf("功能b\n");
    }
    if(strcmp("-c",argv[1])==0){
        printf("功能c\n");
    }

    return 0;
}

 

环境变量表 : env[]

 在main函数中存在第三个参数 char*env[]是让我们的程序拿到环境变量的;

 env[]和argv[]都是以NULL结尾;

#include<stdio.h>

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

由于运行结果太长,这里仅仅展示运行结果部分截图: 

 

通过第三方变量environ获取环境变量

我们也可以通过getenv()来获取; 

也可通过第三方变量environ获取

#include <unistd.h>

extern char **environ;

 

 

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

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

相关文章

代码随想录算法训练营第22天 二叉树 java :235. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

文章目录LeetCode 236. 二叉树的最近公共祖先题目讲解思路LeetCode 701.二叉搜索树中的插入操作题目讲解思路LeetCode 450.删除二叉搜索树中的节点题目讲解思路示图总结既然还是要生活&#xff0c;那么就学会主宰生活LeetCode 236. 二叉树的最近公共祖先 题目讲解 思路 求最小…

【数据结构与算法】详解二叉树以及模拟实现二叉树

文章目录前言:1.二叉树的定义2.二叉树的相关术语3.二叉树的性质4.特殊的二叉树5.二叉树的遍历前序遍历中序遍历后序遍历层序遍历6.获取树中节点的个数方法1:遍历思想方法2:子问题的思想7.获取叶子节点的个数方法1:遍历思想方法2:子问题的思想8.获取第K层节点的个数9.获取二叉树…

链表(LinkedList)

链表(LinkedList) 链表是有序的列表&#xff0c;但是其在内存的存储不一定连续 由这张图我们可以看出 链表是以节点的方式来存储的&#xff0c;是链式存储 每个节点包含data域&#xff0c;next域&#xff1a;指向下一个节点 我们可以发现链表的各个节点不一定是连续存储的 …

再见了HDMI Alt

点击上方“LiveVideoStack”关注我们▲扫描图中二维码或点击阅读原文▲了解音视频技术大会更多信息编者按&#xff1a;其实在未能推出配套线缆和适配器的那一刻&#xff0c;HDMI Alt模式就已经没有未来了。HDMI已全面落后DisplayPort。本文来自Arstechnica。文/Scharon Hardin…

【SpringCloud】Nacos的安装与启动

【SpringCloud】Nacos的安装与启动 一、下载安装包 二、解压 三、端口配置 四、启动 五、访问 【SpringCloud】Nacos的安装与启动 一、下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHu…

分享149个PHP源码,总有一款适合您

PHP源码 分享149个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 149个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1RKnEbbhpfUndnMrxG8rSIQ?pwd0nqp 提取码&#x…

LINUX学习之文本编辑器VIM/VI(八)

简介 VI 是 Unix 操作系统和类 Unix 操作系统中最通用的文本编辑器 VIM 编辑器是从 VI 发展出来的一个性能更强大的文本编辑器。可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计 VIM 与 VI 编辑器完全兼容 模式转换 如下图所示&#xff0c;一般模式下输入i、…

选出相似的文本按照相似度排序difflib.get_close_matches

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 选出相似的文本 按照相似度排序 difflib.get_close_matches 选择题 对于以下python代码表述错误的是? from difflib import get_close_matches myText"python" myList[&…

23种设计模式(十六)——备忘录模式【状态变化】

备忘录模式 文章目录 备忘录模式意图什么时候使用备忘录真实世界类比备忘录模式的实现备忘录模式的优缺点亦称:调解人、控制器、Intermediary、Controller、Mediator 意图 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样可以在以后将这个对…

穿越万年的轮回[期望dp]

首先我们设置dpi,0/1,0/1dp_{i,0/1,0/1}dpi,0/1,0/1​表示经过iii次操作之后开头为red/edrred/edrred/edr&#xff0c;结尾为red/edrred/edrred/edr的串的期望redredred字符串个数。 然后我们考虑转移&#xff1a; 首先我们要来思考一下期望的本质&#xff0c;这样一个状态&…

「Python|VS Code」如何在VS Code中使用Jupyter Notebook运行Python代码

本文主要介绍如何在VS Code安装Jupyter Notebook的扩展并创建notebook文件&#xff0c;并在notebook中运行python代码。同时&#xff0c;介绍使用Jupyter notebook运行python代码的好处。 文章目录安装Jupyter notebook扩展并运行代码Jupyter notebook的好处安装Jupyter notebo…

第十章 STM32F103+ESP8266接入机智云 实现小型IOT智能家居项目

前言 最近有不少小伙伴私信留言&#xff0c;想要我推出一章能够通过APP进行远程控制并获取传感器信息的实验教程。说实话在嵌入式毕设里边&#xff0c;这算是中等偏上水平的了。刚好我也有兴趣写写。全篇4700多字&#xff0c;我写的很详细&#xff0c;按着文章一步一步操作即可…

RabbitMQ的基础学习(上)

前言&#xff1a; RabbitMQ是一个基于AMQP规范实现的消息队列。它具有性能好、高可用、跨平台性、社区活跃等优点&#xff0c;比较适合中小型公司使用。掌握RabbitMQ相关知识&#xff0c;对工作和学习都有帮助。下面我讲详细介绍一下Rabbit的相关知识。 正文&#xff1a; 一、…

【机器学习】缺失值的处理方法总结

目录&#xff1a;缺失值的处理一、总录二、引言三、数据缺失的原因四、数据缺失的类型五、数据缺失的处理方法5.1 删除记录5.2 数据填充5.2.1 替换缺失值5.2.2 拟合缺失值5.2.3 虚拟变量5.3 不处理六、实证演练七、小结一、总录 二、引言 业界广泛流传这样一句话&#xff1a;数…

java构造器2023021

构造器&#xff1a; 构造器是一个特殊的方法&#xff0c;用于创建实例时执行初始化。构造器是创建对象的重要途径&#xff08;即使使用工厂模式、反射等方式创建对象&#xff0c;其实质依然是依赖于构造器&#xff09;&#xff0c;因此Java类必须包含一个或一个以上的构造器。 …

23种设计模式(十五)——适配器模式【接口隔离】

文章目录 意图什么时候使用适配器真实世界类比适配器模式的实现适配器模式的优缺点亦称:封装器模式、Wrapper、Adapter 意图 将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器。 什么时候使用适配器 1、系统需要使用现有的类,而这…

软件设计到底是什么?

软件设计是什么&#xff1a; 就是讨论要用什么技术实现功能&#xff1f;就是要考虑选择哪些框架和中间件&#xff1f;设计就是设计模式&#xff1f;设计就是Controller、Service加Model&#xff1f;…… 一百个程序员&#xff0c;就有一百种理解。若按照这些方式去了解“软件…

Java设计模式中状态模式介绍/状态模式怎么使用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.6 状态模式 6.6.1定义 对有状态的对象&#xff0c;把复杂的"判断逻辑"提取到不同的状态对象中&#xff0c;允许状态对象在其内部状态发生改变时改变…

【C++】哈希表 | 闭散列 | 开散列 | unordered_map 和 unordered_set 的模拟实现

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;unordere…

Ubuntu20.04/22.04 安装 Arduino IDE 2.x

这周收到两片基于LGT8F328P LQFP32的Arduino Mini EVB, 机器上没有 Arduino 环境需要新安装, 正好感受一下新出的 Arduino IDE 2.x, 记录一下 Ubuntu 20.04/22.04 下安装 Arduino IDE 2.x 的过程. 下载解压 下载 访问 Arduino 的官网下载 https://www.arduino.cc/en/softwar…