【Linux】---环境变量

news2024/11/16 17:47:48

文章目录

  • 环境变量
    • 环境变量测试
    • 和环境变量相关的命令
      • echo
      • env
      • export
      • unset
      • set
    • 环境变量的组织方式
    • main函数的几个参数
      • 第三个参数
    • 环境变量的全局性

环境变量

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,例如:

平常我们去执行一个程序一般都会带上 ./ 也就是指定该执行程序的相对路径

但是为什么我们去执行 ls pwd 这些指令时却不需要带上呢?

这是因为这些指令操作系统已经可以通过环境变量去获取,所以不再需要我们去指定了

环境变量测试

常见的环境变量例如 PATH HOME SHELL

PATH 它是用来指定命令的搜索路径的

查看当前所有的环境变量可以使用 env指令查看,因为比较长就不演示图片了,可以自行输入查看。

查看指定环境变量可以使用 echo $环境变量名

image-20221118100058169

上面显示的就是PATH当前的环境变量值,因为PATH中已经有我们平常使用的一些指令的路径,所以当我们使用 ls pwd 等指令时就不再需要去指定其相对路径了。所以当我们编写好程序后,把可执行文件拷贝到环境变量已有的路径中后,我们执行程序时也同样可以不再指定其路径

image-20221118101719404

HOME:指定用户的主工作目录,也就是用户登录到Linux中,默认的目录

所以在不同的用户下,该变量是不同的值。根据这个特点,我们可以利用获取当前的用户HOME变量从而实现不同的功能,下面以root用户和hjb用户举例。

首先在Linux中我们可以通过调用**getenv()**函数去获取指定的环境变量,如果不存在则返回NULL,注:环境变量的值都是一个字符串类型

image-20221118103402940

现在先编写一个程序实现查看当前的用户名

image-20221118104400180

可以看到,同一个程序当时在不同的用户下执行得到的结果是不一样的。利用环境变量这一特性,可以让同一个程序在不同的用户下执行不一样的操作

image-20221118104904591

和环境变量相关的命令

echo

这个是用来显示某个环境变量值的,上面已讲

env

查看所有环境变量

export

设置一个新的环境变量

在讲这个命令首先我们先来认识一下什么是本地变量。在Linux下也是可以直接去定义一个变量的,但是直接定义的变量相当于一个局部变量,所以其实的这个变量并不是一个环境变量,注意环境变量是一个全局的变量

image-20221118110102186

因为定义的变量MYVAL并不是一个环境变量,所以此时找不到该环境变量,就报错了。

这是 export指令就可以用上了,当我们定义变量加上exprot 指令后,该变量就会变成一个环境变量

image-20221118110445761

此时,该变量就是一个环境变量了,使用env查看全部环境变量找也是可以找到的

unset

既然有创建一个新的环境变量,那就会有删除环境变量,unset就是用来删除一个环境变量的

image-20221118110934113

set

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

image-20221118111232831

环境变量的组织方式

环境变量是存放在环境表里的,而环境表就是一个字符指针数组,也就是说环境变量本质上就是一个字符串。每个程序都会受到一张环境表。

在这里插入图片描述

main函数的几个参数

我们在编写代码时,main函数一般都不带参数的,但其实main函数可以有三个参数的

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

}
  1. argc是个整型变量,表示命令行参数的个数(含第一个参数)。
  2. 第二个参数:argv是个字符指针的数组,每一个元素一个字符指针,指向一个字符串。这些字符串就是命令行中的每一个参数(字符串)
  3. 第三个参数:envp是字符指针的数组,数组的每一个原元素是一个指向一个环境变量(字符串)的字符指针

这三个参数都是命令行传入的,现在看一段代码来体会一下

image-20221118113142518

可以看到,argv[]是获取我们在命令行上输入的指令的,当我们只是输入一个执行指令,那main函数接收到的也就只有一个,如果我们加上几个选项之后获取的就不止一个了。所以根据这个特性,我们可以通过对选项的识别进行不同的操作。

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

int main(int argc, char* argv[], char* env[]){
    //如果命令行输入两个以上指令则报错
    if(argc != 2){
        printf("Usage:\n\t%s [-a/-b/-c/-ad/-bc]\n",argv[0]);
        return 1;
    }
	
    //不同的选项对应不同的输出
    //识别argv接收的第二个元素
    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");                                                                       
    if(strcmp("-ad", argv[1]) == 0)
        printf("-ad\n");
    if(strcmp("-bc", argv[1]) == 0)
        printf("-bc\n");

    return 0;
}

image-20221118114037181

第三个参数

这个参数通俗讲就是所有的环境变量来着

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

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

  return 0;
}

可以通过这段代码,就可实现env指令的功能了。

如果不给main函数传参的话也是可以实现的,系统本身给了我们一个变量

extern char** environ

该变量记录的也是所有的环境变量,因此以下代码也是可以输出所有的环境变量

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

    return 0}

环境变量的全局性

环境变量通常具有全局属性,可以被子进程继承下去

大家可以想想,为什么将环境变量定义后,就不需要再加路径去执行程序了呢?

程序在执行的时候就会变成一个进程,所有的程序都可以看作是一个进程。所以bash本身就是一个系统进程,我们编写的可执行程序一旦开始运行就也会变成一个进程,并且是bash这个系统进程的子进程,因为环境变量具有全局性,所以它是会被所有的子进程继承下去的,在应对不同的场景时bash就会帮助该程序找相应的路径进行身份认证,所以当环境变量存在时就不再需要通过路径去执行程序了

像本地变量就不一样,它是只会在当前进程内有效,也就是bash进程。

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

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

相关文章

Multiscale Vision Transformers 论文详解

Abstract 我们提出了 Multiscale Vision Transformers&#xff08;MViT&#xff09;用于视频和图像识别。MViT 是多尺度特征层次结构和Transformer的结合。MViT 有几个通道分辨率尺度块&#xff08;channel-resoluation scale stages&#xff09;。从输入分辨率和小通道维度开始…

JavaScript学习——什么是编程语言?计算机基础

每篇博文的浪漫主义 【Study Vlog #21 | 计划被打断之后的报复性学习 | 喜欢秋天安静的学习时刻】 https://www.bilibili.com/video/BV1b84y1B79c/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 Study Vlog #21 | 计划被打断之后的报复性学习 | 喜欢…

Android程序设计之学校疫情防控管理

基于Android实现的学校疫情防控管理&#xff0c;项目采用SQLite来存储数据。 SQLite 简介 SQLite是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎&#xff0c;这是在普及方面的增长&#xff0c;…

测试工作的完整流程

需求评审&#xff1a;确保各部门需求理解一致。计划编写&#xff1a;根据重要核心程度来决定先测哪些功能后测哪些功能&#xff0c;测什么、谁来测、怎么测 a. 测什么&#xff1a;测哪些功能 b. 谁来测&#xff1a;具体的测试人员 c. 怎么测&#xff1a;具体测 功能、性能、兼容…

公众号免费搜题接口

公众号免费搜题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

笔试强训(三十八)

目录一、选择题二、编程题2.1 蘑菇矩阵2.1.1 题目2.1.2 题解2.2 红与黑2.2.1 题目2.2.2 题解一、选择题 &#xff08;1&#xff09;下列关于URL的描述错误的是&#xff08;A&#xff09; A.http表名使用TCP协议 B.又名统一资源定位符&#xff0c;方便确定一个资源&#xff0c;…

邮件营销:怎么正确地收集邮件地址?

邮件营销提供了收件人和发件人双向沟通的平台&#xff0c;这对于企业来讲是一个很好的开发客户、和客户建立联系的方式。但是想要获得良好的营销效果&#xff0c;前提是我们需要拥有优质的联系人地址列表。怎么正确地收集邮件地址呢&#xff1f; 一般来讲&#xff0c;有三种邮…

2023年考PMP证书有什么意义?

每年都有一个关于 PMP 证书的意义的热门话题&#xff0c;PMP 证书必然是有意义的&#xff0c;不然怎么每年都有那么多人报考呢&#xff1f; 一、先给大家分析一下PMP 证书的使用场景 1、项目管理岗位招聘的门槛 PMP 是项目管理领域的一个权威公认证书&#xff0c;近几年受到的…

PROTAC——小分子化合物

PROTAC VS. 传统小分子 PROTAC 全称为 proteolysis-targeting chimeras (蛋白水解靶向嵌合分子)&#xff0c;是一种杂合双功能小分子化合物&#xff0c;由三部分组成&#xff1a;靶蛋白配体、连接子 Linker、和 E3 连接酶配体&#xff0c;结构中两个配体之间通过 linker 相连&a…

Serverless 的前世今生

作者&#xff1a;阿里云用户组 从云计算到 Serverless 架构 大家好&#xff0c;我是阿里云 Serverless 产品经理刘宇&#xff0c;很高兴可以和大家一起探索 Serverless 架构的前世今生。 从云计算到云原生再到 Serverless 架构&#xff0c;技术飞速发展的轨迹都有一定规律可循…

Notch 信号通路的抑制剂、检测

近期&#xff0c;Cell 刊登了清华大学施一公课题组大作&#xff1a;Structural basis of γ-secretase inhibition and modulation by small molecule drugs&#xff0c;该文阐述了 γ-分泌酶结合三种小分子抑制剂 (GSI) 和一种调节剂 (GSM) 的冷冻电镜结构&#xff0c;并首次展…

Seata AT模式下的源码解析(一)

源码仓库&#xff1a;https://gitee.com/haijun1998/seata.git 分支source-read-1.5.0 1. GlobalTransactional GlobalTransactional 注解&#xff0c;提供给客户端来创建一个全局事务&#xff0c;GlobalTransactional 注解由 GlobalTransactionScanner 进行扫描&#xff0c;…

Java总结String类

String类专门用来表示字符串类型字符串构造的主要三种方法【学习一个类&#xff0c;先学习他的构造方法】 public class TestDemo1 {public static void main(String[] args) {String s1 "Hello";String s2 new String("Hello");char[] array {H,e,l,l…

[附源码]java毕业设计校园爱心支愿管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]SSM计算机毕业设计高校奖学金评定管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

基于PHP+MySQL校园网站的设计与实现

校园生活是很多大学生没好的回忆,为了能过让更多的校园风采展示给人们,我们通过PHP和MYSQL开发了本校园网站的设计与实现,通过本网站可以更好的展示校园内风采和美好生活 本系统分为前台和后台2部分,前台部分主要是展示校园内的一些风采和新闻信息,后台部分主要是给管理员对网站…

1、skywalking-介绍

1、skywalking 介绍 随着微服务的兴起与流行&#xff0c;一些微服务架构下的问题也会越来越突出&#xff0c;服务之间的依赖关系愈发复杂。 如果某个服务出现问题&#xff0c;寻找问题往往需要很长的时间&#xff0c;可能需要一个一个服务的查找问题&#xff0c;由此我们 就有了…

ARFoundation系列讲解 - 69 HumanBodyTracking2D

---------------------------------------------- 视频教程来源于网络,侵权必删! --------------------------------------------- 一、简介 HumanBodyTracking2D(身体跟踪2D)案例,当设备检查到人体时,会返回检测到人体关节点的2D屏幕空间位置(需要在iOS 13或更高版本的…

详细讲解Linux内存泄漏检测实现原理与实现

在使用没有垃圾回收的语言时&#xff08;如 C/C&#xff09;&#xff0c;可能由于忘记释放内存而导致内存被耗尽&#xff0c;这叫 内存泄漏。由于内核也需要自己管理内存&#xff0c;所以也可能出现内存泄漏的情况。为了能够找出导致内存泄漏的地方&#xff0c;Linux 内核开发者…

Apache部署静态网站

Apache安装(Linux安装Apache)网站模板(https://sc.chinaz.com/moban) Apache配置https://httpd.apache.org/docs/2.4/vhosts/examples.html 1.编辑&#xff1a;/opt/apache/httpd-2.4.54/conf/httpd.conf # Ensure that Apache listens on port 80 Listen 80 <VirtualHost *…