Linux之环境变量

news2024/11/25 22:39:57

文章目录

  • 前言
  • 一、环境变量
    • 1.概念
    • 2.运行程序
    • 3.windows下的环境变量
    • 4.常见的环境变量
  • 二、系统调用获取环境变量
    • 1.getenv
    • 2.演示
      • 1.标识当前的Linux用户
      • 2. 判断当前用户是否为root
  • 三、设置环境变量
    • 1.关于变量的命令
      • 1.echo
      • 2.export
      • 3.env
      • 4.unset
      • 5.set
    • 2.子进程继承
    • 3.PWD
      • 1. 概念
      • 2.实现PWD
  • 四、命令行参数
  • 五、代码获取环境变量
    • 1. main函数的第三个参数`char* env[]`。
    • 2. 通过第三方变量environ获取
  • 六、环境变量的组织方式
  • 总结


前言

本文介绍了Linux中的环境变量的相关概念。


一、环境变量

1.概念

  1. 环境变量(environment variables),一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性(类似于程序中的全局变量)。

2.运行程序

  1. 要执行一个程序,首先要找到该程序在磁盘中的位置,那么如何去寻找该程序呢?
    当然是通过该程序的路径。

问题来了,为什么系统命令也是程序,但是执行它们时我们不需要带上路径,而我们自己的程序需要带上路径(例如:执行当前目录下的可执行文件test,需要用./test,'.'是当前路径的意思,因此是执行当前路径的文件test)。

  1. 如果我们想让自己的程序在执行时也不需要带上路径(即,直接使用test)应该怎样做
  • 方法1:
    将要执行的文件拷贝到系统的默认路径下(系统执行命令会在默认路径下寻找)。
    命令:sudo cp 文件名 /usr/bin/
    但是,我们不推荐这种方法,因为我们自己的程序未经过测试会污染操作系统的指令池。
    这种方法之所以可以实现,是因为系统的环境变量会帮助编译器查找对应的文件。
  • 方法2:
    直接将当前路径添加到环境变量里。
    命令:export PATH=$PATH:当前路径//注意分割路径使用的时':'
    在Linux中的bash(命令行)是可以定义变量的。Xshell登录的时候,系统会将.bash_profile执行一次,将环境变量放置在当前的shell中,所以一旦启动成功系统就会在内存中维护一个环境变量$PATH

3.windows下的环境变量

在这里插入图片描述

4.常见的环境变量

PATH:指定命令的搜索路径
在这里插入图片描述

HOME:指定用户的主工作路径(即,用户登录到Linux系统中的默认路径,用户的家目录)
在这里插入图片描述

LOGNAME:当前登录的用户名
在这里插入图片描述

HOSTNAME:主机名
在这里插入图片描述

SHELL:当前Shell,它的值通常是/bin/bash
在这里插入图片描述
查看环境变量的方法:

  1. env(查看所有的环境变量)
    在这里插入图片描述
  2. echo $NAME(NAME用环境变量名来替换,就像上面查看的常见的环境变量一样)

二、系统调用获取环境变量

如果我们不想通过指令来获取环境变量,而是想在程序中获取环境变量,那么我们可以使用系统调用getenv

1.getenv

在这里插入图片描述
在这里插入图片描述

2.演示

1.标识当前的Linux用户

文件test1.c

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #define USER "USER"
  4 int main()
  5 {
  6         char* who = getenv(USER);
  7         printf("user:%s\n",who);
  8         return 0;
  9 }

运行结果
在这里插入图片描述

2. 判断当前用户是否为root

文件test1.c

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #define USER "USER"
  5 int main()
  6 {       
  7         char* who = getenv(USER);
  8         if(strcmp(who,"root") == 0)
  9         {       
 10                 printf("user:%s\n",who);
 11         }
 12         else
 13         {       
 14                 printf("权限不足\n");
 15         }
 16         return 0;
 17 }

运行结果:
在这里插入图片描述
这就解释了如何知道当前用户是否有权限去访问某文件。
执行指令或者访问文件时,文件(指令也是文件)上面的拥有者和所属组都会更根据当前用户的环境变量USER,去进行身份认证,判断是否拥有权限。

三、设置环境变量

1.关于变量的命令

1.echo

显示某个环境变量值
在这里插入图片描述
为什么用echo可以显示myval的值,但是用env不能显示该变量的值?
因为该变量不是环境变量而是本地变量,因此,图中的方式不是正确设置环境变量的方式。正确的方式应该使用export

2.export

设置一个新的环境变量
在这里插入图片描述

3.env

显示所有环境变量
也可以用grep 命令,筛选出我们想看到的环境变量,如果没有就什么也不显示

4.unset

清除环境变量
在这里插入图片描述

5.set

显示本地定义的shell变量(本地变量,类似于程序中的局部变量)和环境变量
在这里插入图片描述

2.子进程继承

bash是一个系统进程,而在命令行上运行./mycmd时,mycmd会变成bash的子进程。环境变量具有全局属性的根本原因是它是定义在bash中的,而父进程的全局变量会被子进程共享(即,会被子进程继承下去)。本地变量是定义在进程中的局部变量,只在当前进程(bash)中有效。
为什么子进程要继承父进程的环境变量?
答:为了不同的应用场景,例如:上面用USER实现的身份认证,有的进程需要用到这些环境变量来完成对应的任务。

3.PWD

1. 概念

显示当前路径
系统是如何得知我当前的路径在哪里?
例如:操作系统的基础指令ls,加上文件名就可以查看文件,不用加上对应的路径,那么系统是如何得知我当前的路径呢?——PWD
该环境变量在bash中维护当前所处路径。路径发生改变时,shell会调整环境便利的值,而运行ls时在创建子进程,环境变量会被子进程继承,所以ls拿到了当前路径,因此使用ls时不需要带上当前路径。

2.实现PWD

文件test2.c

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 int main()
  5 {
  6         printf("%s\n",getenv("PWD"));
  7         return 0;
  8 }

运行结果:
在这里插入图片描述

四、命令行参数

main函数也是有参数的:argc(命令行参数的个数)、argv[](命令行参数表)、env[](环境变量表)。
main函数也是被系统进行调用的,它的参数是由系统进行传参的。

  1 #include<stdio.h>
  2 int main(int argc , char* argv[])
  3 {
  4         int i = 0;
  5         for(;i < argc; ++i)
  6         {
  7                 printf("argv[%d] -> %s\n", i, argv[i]);
  8         }
  9         return 0;
 10 }

运行:
在这里插入图片描述
可以看到我们在命令行输入的参数越多,数组argv的内容也就越多。
命令行参数实际上是将程序名(文件名)和选项(-a/-b/-c等)传递给argv(指针数组,argv[0]存储的是程序名,剩下的存储的是选项),而argc表示选项的个数
命令行参数的意义在于通过不同的选项控制不同的结果。
例子:
文件test2.c

  1 #include<stdio.h>
  2 int main(int argc , char* argv[])
  3 {
  4         int i = 0;
  5         if(argc != 2)
  6         {
  7                 printf("Usage:\n\t%s [-a/-b/-c/-ab/-ac/-bc/-abc]\n",argv[0]);
  8         }
  9         if(strcmp("-a",argv[1]) == 0)
 10         printf("功能a\n");
 11         if(strcmp("-b",argv[1]) == 0)
 12         printf("功能b\n");
 13         if(strcmp("-c",argv[1]) == 0)
 14         printf("功能c\n");
 15         if(strcmp("-ab",argv[1]) == 0)
 16         printf("功能ab\n");
 17         if(strcmp("-ac",argv[1]) == 0)
 18         printf("功能ac\n");
 19         if(strcmp("-bc",argv[1]) == 0)
 20         printf("功能bc\n");
 21         if(strcmp("-abc",argv[1]) == 0)
 22         printf("功能abc\n");
 23         return 0;
 24 }

运行:
在这里插入图片描述

五、代码获取环境变量

上面的getenv就是一种代码获取环境变量的方法。

1. main函数的第三个参数char* env[]

文件test3.c

  1 #include<stdio.h>
  2 int main(int argc, char* argv[], char* env[])
  3 {
  4         int i = 0;
  5         for(;env[i]; ++i)
  6         {
  7                 printf("env[%d] : %s\n", i, env[i]);
  8         }
  9         return 0;
 10 }

在这里插入图片描述

2. 通过第三方变量environ获取

文件test3.c

  1 #include<stdio.h>
  2 int main(int argc, char* argv[], char* env[])
  3 {
  4         extern char** environ;
  5         int i = 0;
  6         for(;environ[i]; ++i)
  7         {
  8                 printf("env[%d] : %s\n", i, environ[i]);
  9         }
 10         return 0;
 11 }

在这里插入图片描述

六、环境变量的组织方式

每个进程运行的时候都会有一张环境变量表,它本质是一个字符指针数组,每个指针指向一个以'\0'为结尾的字符串。
在这里插入图片描述


总结

以上就是今天要讲的内容,本文介绍了环境变量的相关概念。本文作者目前也是正在学习Linux相关的知识,如果文章中的内容有错误或者不严谨的部分,欢迎大家在评论区指出,也欢迎大家在评论区提问、交流。
最后,如果本篇文章对你有所启发的话,希望可以多多支持作者,谢谢大家!

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

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

相关文章

手摸手教你用AI生成PPT(本文不卖课)

今天再和大家分享一个AI实践&#xff1a; 如何借力AI帮我制作PPT&#xff1f; 上篇和大家安利了目前不用魔法上网&#xff0c;且不用翻墙的最强AI工具&#xff0c;假设我今天要给大家做一个分享&#xff0c;来介绍Claude&#xff0c;如何搞定PPT呢&#xff1f; 当然是直接问Cla…

如何在华为OD机试中获得满分?Java实现【放苹果】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

SpringBoot——原理(自动配置+原理分析-源码跟踪)

源码跟踪 从Springboot的启动类进入&#xff0c;进行分析. 源码跟踪技巧 在以后接触各种框架的时候&#xff0c;如果需要查看源码&#xff0c;需要找到关键点和核心流程&#xff0c;先在宏观对整个原理和流程有一个认识&#xff0c;之后再去了解其中的细节。 按住Ctrl左键进…

[机缘参悟-98] :层次不同、维度不同、视角不同、结论不同

目录 全局VS具备&#xff0c; 总体V部分 认知的六个认知层次&#xff1a; 认知的六个立体化维度&#xff1a; 0、维空间&#xff0c;点思维 1、一维空间&#xff0c;直线思维 2、二维空间&#xff0c;平面思维 3、三维空间&#xff1a;立体思维。 4、四维空间&#xff…

(0)调优

文章目录 前言 1 调优过程说明 2 设置飞机进行调优 3 任务规划器助手 4 初始调优飞行 5 评估飞机的调优 6 手动调优 7 自动调优 8 输入整形 9 基于发射器的调优 10 配置Notch滤波器 11 配置飞行中的FFT 前言 在默认的 PID 设置下&#xff0c;ArduPilot 可以在开箱…

Windows PyCharm 2022/2023 使用Centos7 的虚拟环境 venv 实现文件实时同步 代码代码Git自动识别 解决 Samba Cannot Save File 的问题

前期准备 git报错 fatal: unsafe repository 解决方法 因为是远程文件夹&#xff0c;老版本时没这个问题&#xff0c;新版本git或者pycharm有这个限制&#xff0c;不能自动识别更改的代码&#xff0c;报unsafe.directory的问题&#xff0c;直接暴力解决&#xff0c;加* git c…

美债死期推迟

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在小号“刘教链Pro”发表了一篇《链上投票是社会契约的一种存证》&#xff0c;探讨未来组织和DAO的治理问题&#xff0c;欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币略有回升&#xff0c;从26.5k下方来到了26.5k…

风辞远的科技茶屋:可怖的AI

大家好&#xff0c;我是脑极体的风辞远。一直以来我们都在写大块文章&#xff0c;很少有机会跟大家聊天。时间长了&#xff0c;总觉得这种方式有一点冷漠感&#xff0c;不够轻松&#xff0c;加上往往每篇文章只聚焦一个话题&#xff0c;而我们产能有限&#xff0c;就会有很多值…

[创业之路-71] :创业思维与打工思维的区别

其实打工思维和创业思维最核心的本质区别是你是否愿意去尝试。 很多时候我打工的时候老板没发现我的潜质&#xff0c;所以我去创业了&#xff0c;这个没有&#xff0c;你打工的时候一定有一项极其长的长项&#xff0c;只不过当时你可能也没意识到&#xff0c;老板没意识到。 …

ChatGPT在App Store累计下载量已突破50万次;Anthropic已成功完成4.5亿美元C轮融资

&#x1f680; OpenAI的ChatGPT应用在苹果App Store上线6天时间内&#xff0c;累计下载量已突破50万次。 OpenAI的ChatGPT应用在苹果App Store上线6天时间内&#xff0c;累计下载量已突破50万次。 与微软必应等聊天机器人相比&#xff0c;其热度远超过且持续上升。 &#x1…

redis未授权访问漏洞

1、什么是redis未授权访问漏洞 Redis安装后&#xff0c;如果绑定在 0.0.0.0:6379&#xff0c;并且没有进行采用相关的策略&#xff0c;比如添加防火墙规则避免其他非信任来源 ip 访问等&#xff0c;这样将会将 Redis 服务暴露到公网上&#xff0c;如果在没有设置密码认证或使用…

如何顺序处理设备上报的数据

1. 引言 随着智能技术的发展&#xff0c;市场上出现了很多的智能设备&#xff0c;其具有连接网络的能力。用户可以实现远程控制&#xff0c;并且设备也可上报自己的状态&#xff0c;实现云端对设备的运行情况分析。在某些情况下需要保证设备上报状态的有序性&#xff0c;例如传…

简单介绍二叉树

前言 学习数据结构&#xff0c;二叉树是一大难点&#xff0c;也是一大重点&#xff0c;小伙伴们和我一起看看二叉树的知识吧&#xff01; 本文代码是Java。 目录 前言 一、什么是二叉树 二、二叉树的遍历 &#xff08;一&#xff09;前序遍历 &#xff08;二&#xff09;中…

C++ 入门导引(这是一篇由GPT4写的文章)

C 应用场景 C 是一种广泛应用的编程语言&#xff0c;拥有多种使用场景。以下是 C 的一些主要应用场景&#xff1a; ​1. 游戏开发&#xff1a;C 常用于游戏开发&#xff0c;尤其是大型 3D 游戏。它可以轻松地与图形 API&#xff08;如 OpenGL 和 DirectX&#xff09;集成&…

element-ui树形控件el-tree详解

概述 这里我利用element-ui开发一个vue的树形组件 引入element-ui 安装element-plus cnpm install element-plus --save 安装按需导入 cnpm install -D unplugin-vue-components unplugin-auto-import 修改vite.config.js配置按需加载 import AutoImport from unplugin-a…

云原生架构:创新未来的应用开发和部署范式

点击上方“程序猿技术大咖”&#xff0c;关注并选择“设为星标” 回复“加群”获取入群讨论资格&#xff01; 摘要&#xff1a;本文深入探讨云原生架构的优势、实施指南以及关键技术和工具。通过容器化、微服务架构、持续交付和自动化管理等实践&#xff0c;云原生架构为企业提…

盘点一个Python列表的基础题目

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 随意春芳歇&#xff0c;王孙自可留。 大家好&#xff0c;我是皮皮。 一、前言 前几天在Python最强王者群【eric】问了一个Python列表基础的问题&#x…

web练习第二周

前言&#xff1a;&#xff08;博主个人学习笔记&#xff0c;不用看&#xff09;web练习第二周&#xff0c;仅做出前3题。相比于第一周&#xff0c;难度大幅增加&#xff0c;写题时就算看了wp还是像个无头苍蝇一样到处乱创&#xff0c;大多都是陌生知识点&#xff0c;工具的使用…

购买两块巧克力-第105场力扣夜喵双周赛-java双百方案

一、题目描述 给你一个整数数组 prices &#xff0c;它表示一个商店里若干巧克力的价格。同时给你一个整数 money &#xff0c;表示你一开始拥有的钱数。 你必须购买 恰好 两块巧克力&#xff0c;而且剩余的钱数必须是 非负数 。同时你想最小化购买两块巧克力的总花费。 请你…

【原创】浅谈EtherCAT主站EOE(上)-EOE网络

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;未经同意&#xff0c;禁止转载。如有问题&#xff0c;欢迎指正。博客地址&#xff1a;https://www.cnblogs.com/wsg1100/ 文章目录 一、EoE二、EoE服务规范EtherCAT主站如何提供EoE服务&#xff1f; 三、EoE网络EOE网…