【Linux】环境变量本地变量

news2024/9/29 13:29:31

文章目录

    • 环境变量
        • 基本概念
      • 常见环境变量
      • 和环境变量相关的命令
      • 为什么带./运行我们的可执行程序
      • 本地变量
      • 环境变量的组织方式
      • 环境变量具有全局属性

环境变量

基本概念

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

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

常见环境变量

前面我们也提过:如何查看环境变量:echo &PATH 其中NAME是环境变量的名称

  • PATH : 指定命令的搜索路径

image-20220412221431871

  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的家目录)

image-20220412221635559

  • SHELL : 当前Shell,它的值通常是/bin/bash
    • 以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类

image-20220412221657394


和环境变量相关的命令

export: 设置一个新的环境变量 echo: 显示某个环境变量值(环境变量和本地变量的值都可以显示) echo $环境变量名

image-20220412222032387


env: 显示所有环境变量

image-20220412221850869

unset: 清除本地变量 || 环境变量

image-20220412222257251


部分环境变量说明:

环境变量名称表示内容
PATH命令的搜索路径
HOME用户的主工作目录
SHELL当前Shell
HOSTNAME主机名
TERM终端类型
HISTSIZE记录历史命令的条数
SSH_TTY当前终端文件
USER当前用户
MAIL邮箱
PWD当前所处路径
LANG编码格式
LOGNAME登录用户名

为什么带./运行我们的可执行程序

Linux下一切东西皆是文件,我们执行自己的可执行程序,为什么要带./来运行呢? (本质是运行当前目录(.)下的可执行程序)

要执行一个可执行程序必须要先找到它在哪里,既然不带./就可以执行系统命令,说明系统能够通过命令的名称找到指令的位置,而系统是无法找到我们自己的可执行程序的, 带./是为了找到对应的程序,告诉系统该可执行程序位于当前目录下,当然我们也可也使用绝对路径和其它相对路径来运行程序

image-20220412215257129


系统的命令也是文件,为什么可以直接执行,而不用带路径呢?

这是因为环境变量PATH的原因 ,PATH:指定命令的搜索路径


例子:如何查看环境变量:echo &PATH 其中NAME是环境变量的名称

image-20220412215545932

:作为分隔符,分隔出多条路径,当执行系统命令的时候,会从左到右依次逐级查找

同样我们可以使用which指令查看指令的保存路径:可以发现这个路径就在PATH里面

image-20220412215715892


当然我们也可也把我们的可执行程序加到PATH路径里面,那么我们执行可执行程序,就可以直接使用可执行程序的文件名字来直接运行

错误方法:exprot PATH=可执行文件的路径 -> 这种做法相当于是直接把环境变量覆盖了!

如何撤销?重新启动xshell


正解: 方法1:把命令(我们自己写的可执行程序也可以看做是某种命令) 拷贝到环境变量PATH的某一路径下

sudo cp 可执行程序 /usr/bin 但是不推荐这种方法,因为会污染命令池

现在我们知道,所谓的安装软件,就是把软件拷贝到系统环境的某一特定路径下


方法2:将我们的当前可执行文件的路径添加到环境变量PATH中 (这种方法只在当前登陆有效)

导入环境变量:export PATH=$PATH:可执行文件的路径

image-20220412220935576

这里设置的是内存级的环境变量,并没有写入到系统文件中,只在当前登陆有效

本地变量

本地变量只在本次登陆有效

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

  • 注意:直接使用set会显示所有的内容, 我们一般搭配行过滤工具grep使用

unset: 清除本地变量 || 环境变量

image-20220412222851712

image-20220412222949535


环境变量的组织方式

main函数实际是可以带三个参数的,

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

参数说明:

  • argc:限定命令行字符串个数, 限定只能传多少个参数
  • argv : 指向一个个的命令行参数
  • env: 指向一个个环境变量
int main(int argc,char* argv[],char* env[])
{
    if(argc!=5) //限制只能传5个参数
    {
        return 1;
    }
    //....
}

例子:

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

image-20220413230944560

  • argv:指针数组
  • **env:**指针数组,是一个环境表

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


上述的argc和argv是命令行参数, env环境变量

image-20220413231030884


命令行参数存在的价值:

指令有很多选项,用来完成同一个命令不同子功能.选项底层就是通过命令行参数实现的

image-20220413082418115

我们可以通过给同一个函数带入不同参数的方式,执行不同的逻辑.

例子:

#include<stdio.h>
#include<string>
int main(int argc,char* argv[])
{
    //限定只能传两个命令行参数
    if(argc!=2)
    {
        printf("Usage:%s-[a|b]\n",argv[0]);
        return 0;
    }
    if(strcmp(argv[1],"-a"))
    {
        printf("hello -a\n");
    }
    else if(strcmp(argv[1],"-b"))
    {
        printf("hello -b\n");
    }
    else	//带其它参数
    {
        printf("hello\n");
    }
}

执行效果:

image-20220413231101846


指令有很多选项,用来完成同一个命令的不同子功能,选项底层使用的就是我们的命令行参数,这也是命令行参数的意义


通过程序获取环境变量:

方法1:通过env指针数组

因为env指针数组的最后一个元素是NULL,所以我们可以直接使用env[i]作为结束判断

env的参数个数不需要判断,是系统提供的,只需要使用即可

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

方法2:通过第三方变量environ获取

environ是系统提供的第三方变量,类型为char**,指向环境表的起始地址

environ+i:第i个环境变量的地址 environ[i] = *(environ+i):第i个环境变量的内容

image-20220514150134016

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明

#include <stdio.h>
int main(int argc, char* argv[])
{
    extern char **environ;//先声明外部变量
    int i = 0;
    for(i = 0; environ[i]; i++)
    {
        printf("%s\n", environ[i]);
    }
    return 0;
}

方法3:可以通过环境变量名,获取环境变量的内容 getenv函数可以获取环境变量的内容

image-20220413231354090

例子:

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

image-20220413231432646

本质是:拿着变量名 ->找到环境变量 -> 再拿到变量中的内容


如果让我们自己设计一个getenv:

例如:getenv("PATH")

方法:遍历所有的环境变量查找, 例如:strstr(target,"PATH=") target代表的是当前遍历到的环境变量,找到之后, 从target起始位置+PATH=的字符串长度,跳过前面的内容, 来到/位置,然后要的是/后面的内容

例如:PATH=/isr/sbin:/usr/bin:/sbin:/bin\0 此时我们要的是:/isr/sbin:/usr/bin:/sbin:/bin


环境变量具有全局属性

环境变量具有全局属性,本质是因为环境变量可以被子进程继承

#include<stdio.h>
#include<unistd.h>
int main()
{
    printf("I am a process PID:%d PPID:%d\n",getpid(),getppid());
    return 0;
}

如果我们多执行几次,可以发现:该进程的PID一直在改变,PPID始终保存不变,这是为什么呢?

image-20220413231452986

进程在不断新建,但PID会改变,.命令行上启动的进程,父进程都是bash,即命令行解释器


如何证明环境变量具有全局属性?

#include<stdio.h>
#include<stdlib.h>
int main()
{
    printf("My_envVal:%s\n",getenv("My_envVal"));//通过getenv函数获取My_envVal环境变量的内容
    return 0;
}

image-20220413231514138

环境变量会影响整个"用户系统"

image-20220413222816619

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

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

相关文章

gRPC的简单应用

gRPC的简单应用 gRPC是由开发的一个高性能、通用的开源RPC框架&#xff0c;主要面向移动应用开发且基于HTTP/2协议标准而设计&#xff0c;同时支持大多数流行的编程语言。 官网&#xff1a;https://grpc.io/ 安装protoc 工具 https://protobuf.dev/ 安装Go插件 旧版本直接…

学习HandlerThread

HandlerThread是一个扩展了Thread的类。也就意味着它和普通的Thread类的调用没有什么区别&#xff0c;仍然要调用start()。 如上图所示&#xff0c;扩展后的HandlerThread类有一个Looper和Handler。 关于这一块的知识可以参考一下《关于Handler我们应该知道的知识》 HandlerTh…

普冉PY32系列(五) 使用JLink RTT代替串口输出日志

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志 JLink …

Python-第五天 Python函数

Python-第五天 Python函数一、函数介绍1. 什么事函数二、函数的定义1.函数的定义&#xff1a;2.案例三、函数的参数1.函数的传入参数2.案例升级四、函数的返回值1.什么是返回值2.返回值的语法3.None类型4.None类型的应用场景五、函数说明文档1.函数的说明文档2.在PyCharm中查看…

脑机接口协议V1.0

脑机接口&#xff0c;有时也称作“大脑端口”direct neural interface或者“脑机融合感知”brain-machine interface&#xff0c;它是在人或动物脑&#xff08;或者脑细胞的培养物&#xff09;与外部设备间建立的直接连接通路。在单向脑机接口的情况下&#xff0c;计算机或者接…

leaflet显示高程

很多地图软件都能随鼠标移动动态显示高程。这里介绍一种方法&#xff0c;我所得出的。1 下载高程数据一般有12.5m数据下载&#xff0c;可惜精度根本不够&#xff0c;比如mapbox的免费在线的&#xff0c;或者91卫图提供百度网盘打包下载的&#xff0c;没法用&#xff0c;差距太大…

记录robosense RS-LIDAR-16使用过程3

一、wireshark抓包保存pcap文件并解析ubuntu18安装wireshark&#xff0c;参考下面csdn教程&#xff0c;官网教程我看的一脸蒙&#xff08;可能英语太差&#xff09;https://blog.csdn.net/weixin_46048542/article/details/121730448?spm1001.2101.3001.6650.2&utm_medium…

秒杀项目之服务调用分布式session

目录 nginx动静分离 服务调用 创建配置zmall-cart购物车模块 创建配置zmall-order订单模块 服务调用 spring session实战 什么是Spring Session 为什么要使用Spring Session 错误案例展示 配置spring-session 二级域名问题 用户登录 nginx动静分离 第1步&#xff…

如何用演示程序检测K100|K720|K750电动发卡读写一体机性能

K100|K720|K750电动发卡读写一体机采用工业级设 计&#xff0c;表面烤漆处理&#xff0c;具有良好的耐磨耐腐蚀性。适应各种高、低温&#xff0c; 多灰尘等 恶劣环境。其发卡原理为拟人型摩擦式发卡&#xff0c;对各类变形卡有非常好的适应性。 CNC的精度保证卡距的绝对一致性、…

Filter过滤器完成验证代码的封装

Filter过滤器完成验证代码的封装filter是什么1 使用filter2 filter配置到项目中验证用户权限是需要反复使用的代码块&#xff0c;把他封装到filter中&#xff0c;减少代码冗余filter是什么 init()方法&#xff1a;初始化方法&#xff0c;在创建Filter后立即调用。可用于完成初始…

刚刚,体验了一把Bing chat很爽

文章目录刚刚&#xff0c;体验了一把Bing chat很爽你能做啥&#xff1f;与chatgpt有什么不同&#xff1f;以下是Bingchat的 10个新功能1⃣️在网上搜索结果2⃣️摘要链接3⃣️对话助手4⃣️向您发送实际信息&#xff0c;正确的链接5⃣️在单个查询中执行多个搜索6⃣️玩冒险游戏…

内网渗透(十八)之Windows协议认证和密码抓取-本地认证(NTML哈希和LM哈希)

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

【Web测试】各类web控件测试点汇总,软测人必备

一 、界面检查 进入一个页面测试&#xff0c;首先是检查title&#xff0c;页面排版&#xff0c;字段等&#xff0c;而不是马上进入文本框校验 1、页面名称title是否正确 2、当前位置是否可见 您的位置&#xff1a;xxx>xxxx 3、文字格式统一性 4、排版是否整齐 5、列表项显示…

leetcode: 3Sum

leetcode: 3Sum1. 题目描述2. 思考3. 解题3. 总结1. 题目描述 Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i ! j, i ! k, and j ! k, and nums[i] nums[j] nums[k] 0. Notice that the solution set must not contain …

爬虫Python入门好学吗?学什么?

爬虫Python入门好学吗&#xff1f;学爬虫需要具备一定的基础&#xff0c;有编程基础学Python爬虫更容易学。但要多看多练&#xff0c;有自己的逻辑想法。用Python达到自己的学习目的才算有价值。如果是入门学习了解&#xff0c;开始学习不难&#xff0c;但深入学习有难度&#…

2022年12月电子学会Python等级考试试卷(一级)答案解析

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;一级&#xff09; 一、单选题(共25题&#xff0c;共50分) 1. 关于Python语言的注释&#xff0c;以下选项中描述错误的是&#xff1f;&#xff08; &#xff09; A. Python语言有两种注释方式&…

JavaEE16-Spring事务和事务传播机制

目录 1.为什么需要事务&#xff1f; 2.MySQL中事务的使用 3.Spring中事务的实现 3.1.编程式事务&#xff08;手动写代码操作事务&#xff09; 3.2.声明式事务&#xff08;利用注解自动开启和提交事务&#xff09;(使用为主) 3.2.1.Transactional作用范围 3.2.2.Transact…

JetpackCompose从入门到实战学习笔记8—ConstraintLayout的简单使用

JetpackCompose从入门到实战学习笔记8—ConstraintLayout的简单使用 1.简介&#xff1a; Compose 中的 ConstraintLayout ConstraintLayout 是一种布局&#xff0c;让您可以相对于屏幕上的其他可组合项来放置可组合项。它是一种实用的替代方案&#xff0c;可代替使用多个已嵌…

JVM垃圾回收机制GC理解

目录JVM垃圾回收分代收集如何识别垃圾引用计数法可达性分析法引用关系四种类型&#xff1a; 强、软、弱、虚强引用软引用 SoftReference弱引用 WeakReferenceWeakHashMap软引用与虚引用的使用场景虚引用与引用队列引用队列虚引用 PhantomReference垃圾回收算法引用计数复制 Cop…

06- 梯度下降(SGDRegressor) (机器学习)

梯度下降算法也是先构建误差值的函数, 通过求误差值函数的最小值来达到误差最小的目的, 不过梯度下降是先随机取值, 然后求函数在该点的导数, 如果导数为正, 下一次取值向反方向移动, 如果导数为负, 正向移动, 直到导数取值极小时, 认定误差达到一个可以接受的范围, 然后导出相…