3环境变量

news2024/10/3 6:31:58

文章目录

  • 前言
  • 1. 概念引入
  • 2. 环境变量PATH
  • 3. 本地环境变量与系统环境变量
  • 4. set 和 env
  • 5. main函数带参数

前言

大家一开始学习Linux时候,是否对其各种命令感到过好奇,为何这样输入不同就会执行不同,他的底层实现逻辑到底是怎么样的呢?

在解答这个疑惑之前,我们需要学习环境变量以及怎样利用


1. 概念引入

当我们写好一个程序并进行编译链接后,需要使用命令./二进制文件名运行,而我们前面每次查看进程pid时候都是用的

ps -ajx | head -1 && ps -ajx | grep 二进制文件名(以StatR.exe举例)

但Linux系统给我们显示的确是./StatR.exe

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E12KGBFu-1668514789267)(https://gitee.com/du-weiwei/typora/raw/master/image-20220308230248256.png)]

(./StatR.exe是我们的运行的进程,下面是grep命令的进程)

通过这个现象我们可以看出运行中的程序,进程,指令等各种称呼在Linux系统中其实是一个概念,都为进程,既然是一个概念,为何像ls pwd ps 等命令不需要加./,而我们自己写的程序就需要呢?可以不加./吗?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ifkwc3RU-1668514789269)(https://gitee.com/du-weiwei/typora/raw/master/image-20220308231354244.png)]

可以看到,如果不加./告诉linux执行指令StatR.exe,OS就会提供命令找不到的错误.

也就是说Linux在执行StatR.exe这个命令之前去了某个地方查找,但是没有找到.

那这个地方是什么呢? PATH.


2. 环境变量PATH

环境变量说到底也是变量,即某种类型的一个具体实例化,就像我们学习C语言时候的变量一样,如int a,a就是变量;

linux系统中,定义变量的方法是变量名="字符串内容",打印变量内容的方法是echo $变量名,注意美元符号不可以丢掉,其作用是提醒echo这是一个变量

test="hello everyone,welcome to my world";
echo $test

运行以后结果为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gHA89F40-1668514789269)(https://gitee.com/du-weiwei/typora/raw/master/image-20220309110746671.png)]

既然PATH是环境变量,那么它的内容是什么呢,我们利用echo进行展示.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VeB5G5XP-1668514789269)(https://gitee.com/du-weiwei/typora/raw/master/image-20220309103249069.png)]

可以发现PATH中有很多路径,也就是说,当我们执行命令时,linux会先去PATH里面的各个路径中查找是否会有该指令,如果有就执行,反之就会报错Command not found;

因此我想要不加./运行程序StatR.exe,就只有把该名字放进PATH中的其中一个路径中,这里提供了两种方法:

  • 把当前指令文件添加到环境变量PATH ,通过cp 命令

    •   cp ./StatR.exe /home/MakeBigMoney/bin
      
  • 把当前路径添加到环境变量PATH, 通过PATH=$PATH : 当前路径

    •   PATH=$PATH:/home/MakeBigMoney/linux_class/class1进程
      

当执行完毕上面的任何一种方法后就达到了我们的需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVUjGlIn-1668514789270)(https://gitee.com/du-weiwei/typora/raw/master/image-20220309113829417.png)]

所以

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

了解了PATH环境变量以后,博主这里告知还有环境变量HOME , SHELL等,大家自行去尝试下打印他们的内容;


3. 本地环境变量与系统环境变量

环境变量分为两种类型,分别是本地环境变量与系统环境变量

上文所提到的由linux自带的变量(PATH,HOME,SHELL)等都是系统环境变量,不随着用户的改变而改变,而我们自定义的如test就是本地环境变量.

本地变量的定义方式: 变量名="字符串"

dog="I have a dog"

系统变量的定义方式:export 本地变量名或者export 变量名="字符串"

export pig="I have a pig"

其中系统变量可以被子继承使用,具有全局属性,本地变量不可以被子继承使用,不具备全局属性(命令行中运行的大部分指令都可以说是解释器bash的子进程)下面演示:

这里提供了一个获取系统环境变量内容的函数getenv(),只需要输入用双引号包含起来的变量名,就可以打印;

//该程序名为:proc
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
    printf("%s",getenv("pig"));
    return 0;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GfjRrUvi-1668514789270)(https://gitee.com/du-weiwei/typora/raw/master/image-20220309132427257.png)]

如果改成dog,会发现报段错误

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D1uvyRH4-1668514789271)(https://gitee.com/du-weiwei/typora/raw/master/image-20220309132517603.png)]

如果把dog变成环境变量,发现又可以正常运行

因为./proc是bash的子进程,而子进程只能使用系统环境变量,所以一开始的dog并不可以被使用;


4. set 和 env

set: 可以显示系统环境变量和本地定义的shell(本地)变量,如果如果不加任何参数,默认全部(系统和本地变量)显示

dog="hello ,I have a dog";
export ppig="hello ,I have a ppig";
set | grep dog  && set | grep ppig;

dog是本地shell变量,ppig是环境变量

在这里插入图片描述

env: 只可以显示系统环境变量,如果如果不加任何参数,默认全部(指系统变量)显示

fish="hello ,I have a fish";
export tree="hello ,I have a tree";
env | grep fish;
env | grep tree;

因为fish不是系统变量,所以enc无法显示

在这里插入图片描述

小问题: 既然fish是本地变量,请问echo $fish是否可以显示其内容,如果可以,请问是否和上面说的子进程无法使用本地变量矛盾?

答: echo可以显示本地变量内容,但是并不矛盾.因为echo,set,env,export等命令不是bash的子进程,他们是shell的内建命令,即shell程序内部的一个函数而已,而本地变量只能在shell内部被访问,所以echo可以访问fish且不矛盾


5. main函数带参数

main函数其实是可以带参数的,而它带参数的需求就是访问环境变量和指令;

main函数的参数有三个

int main(int argc,char* argv[],char* env[]) // 如果不写参数就全不写,如果想省略参数,一般只省略最后一个

argc用于表示数组argv元素数量,argv存储的是外部命令行指令,env存储的是所有系统环境变量

说到这里,大家可能突然明白了linux系统是怎么接收各种指令的了,没错,就是利用的main函数参数,这里示范一个利用main函数接收外部linux指令的程序(程序名为rechive):

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

在这里插入图片描述

问题:main函数带参数的好处?

可以帮助我们设计出利用同一个程序便可以有不同的业务功能!(可以通过获取外部不同的指令,进而完成不同的功能)

第三个参数到底获取的是什么呢?

我们第四小节介绍了set和env,而第三个参数就是获取了所有的env(直接在linux中运行env命令的时候)

char* argv[] 和 char* env[]的数组都是以一个空字符结尾.其ASCII码值为0;以env为例,作图:

在这里插入图片描述


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

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

相关文章

计算机网络-网络层(移动IP通信过程,网络层设备路由器,路由表与路由转发)

文章目录1. 移动IP2. 网络层设备&#xff08;路由器&#xff09;1. 移动IP 移动IP技术是移动结点(计算机/服务器等)以固定的网络IP地址&#xff0c;实现跨越不同网段的漫游功能. 并保证了基于网络lP的网络权限在漫游过程中不发生任何改变。 重点知识点&#xff1a; 移动结点…

互联网食堂大比拼,谁才是互联网养猪场?

虽然疫情导致经济不景气&#xff0c;但是互联网行业怎么会如此不禁波折呢&#xff1f; 果不其然&#xff0c;疫情下的大厂还是大厂&#xff01; 互联网大厂的福利多多&#xff0c;其中最容易让人忽视&#xff0c;但也最让人羡慕的就是互联网大厂的食堂了。 民以食为天&#xff…

线粒体 ClpP 介导的蛋白水解作用可选择性诱导癌细胞死亡

图1. 本篇文章的几大亮点 首先&#xff0c;研究人员利用基因工程的方法&#xff0c;在人 ClpP 上建造了一个有持续活性地点突变&#xff08;Y118A&#xff09;。基于 OCL-AML3 和 Z138 肿瘤细胞系&#xff0c;研究人员研究 Y118A 点突变对于肿瘤细胞的影响。研究发现&#xff…

耗时半月,终于把牛客网上的Java面试八股文整理成了PDF合集

前段时间有不少小伙伴们私信我&#xff0c;最近的面试题越来越困难了&#xff0c;要背的八股文也越来越多了&#xff0c;考核的也越来越细腻了&#xff0c;摆明了就是想让我们面试造航母嘛&#xff0c;真的是太为难我们这些程序员了。。。 这不&#xff0c;为了帮大家节约时间…

如何对低代码/无代码平台进行分类?

如何对低代码/无代码平台进行分类&#xff1f;一个例子就能讲清楚&#xff01; 周末你外出露营&#xff0c;在野外需要搭一个帐篷。有两种方法&#xff1a; 一种是最原始的搭帐篷方法&#xff0c;即有隔水布、外账、内账、营柱骨架等等......另一种是直接“封装好”的&#x…

MOCO----Momentum Contrast

对比学习 这个博客写的很好&#xff0c;去看他的吧 对比学习是一种在高维(即指图片)的连续的输入信号上去构建字典的一种方式&#xff0c;这个字典是动态&#xff0c;因为这个字典里的key都是随机去取样的&#xff0c;而且用来给这些key做编码的也是在训练过程中不停地改变的…

程序环境和预处理

文章目录1.程序的翻译环境和执行环境2.详解编译 链接2.1 翻译环境2.3 运行环境3.预处理详解3.1 预定义符号3.2 #define3.3 宏和函数对比3.4 #undef3.5 条件编译1.程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 第一种是翻译环境&#…

AlexNet网络详解

目录&#xff1a;AlexNet网络详解一、背景二、模型结构三、网络的参数配置四、每一层作详细的分析一、背景 2012年&#xff0c;Alex Krizhevsky等人在多伦多大学的实验室设计出了一个深层的卷积神经网络AlexNet&#xff0c;夺得了2012年ImageNet LSVRC的冠军&#xff0c;且准确…

Redis学习(1)—— 下载、安装、启动服务、连接redis服务

Redis是基于内存的数据结构存储系统&#xff0c;可以作为数据库、缓存、任务队列、消息队列、分布式锁 Redis是key-value数据库&#xff0c;非关系型数据库 一. Windows 1. 下载 下载地址&#xff1a;https://github.com/microsoftarchive/redis/releases 2. 安装 直接…

UNet - unet网络

目录 1. u-net介绍 2. u-net网络结构 3. u-net 网络搭建 3.1 DoubleConv 3.2 Down 下采样 3.3 Up 上采样 3.4 网络输出 3.5 UNet 网络 UNet 网络 forward 前向传播 3.6 网络的参数 4. 完整代码 1. u-net介绍 Unet网络是医学图像分割领域常用的分割网络&#xff0…

软件测试找bug小技巧总结,从初级跨入中级测试......

目录&#xff1a;导读前言一、必备知识二、定位技巧三、常用小技巧方法1、分析问题场景进行预判2、关注请求体的状态码3、关注请求的入参与响应数据4、查看日志5、经验法则四、总结前言 测试工作 测试的过程就是一个寻找影响产品功能和用户体验bug的过程&#xff0c;测试人员发…

C++之多态详解

文章目录前言一、多态的概念概念二、多态的定义及实现1.多态的构成条件2.虚函数3.虚函数的重写3.1多态条件探究(1)多态条件探究一:不符合重写 -- virtual函数(2)多态条件探究二:不符合重写 -- 不是父类的指针或者引用调用(3)多态条件探究三:不符合重写 -- 参数不同(4)多态条件探…

Vue3 - ref 基本类型(通俗易懂,详细教程)

简介 它是 Vue3 提供的一个用于创建基本数据类型的函数&#xff0c;能将普通的数据包装为响应式。 大白话说&#xff0c;就是咱们要创建一个响应式变量&#xff0c;需要通过这玩意才行&#xff01; 回忆 Vue2 不理解没关系啊&#xff0c;我们先来回顾一下 Vue2 中是如何做到的…

MaxViT: Multi-Axis Vision Transformer

论文&#xff1a;https://arxiv.org/abs/2204.01697 代码地址&#xff1a;https://github.com/google-research/maxvit 在本文中&#xff0c;介绍了一种高效且可扩展的注意力模型&#xff0c;称之为多轴注意力&#xff0c;该模型由两个方面组成&#xff1a;分块的局部注意力和…

开源作品:引流宝!集活码、短网址等功能为一体的工具!致力于提高引流效率,减少资源流失!

前言 开发这款工具的初衷是为了辅助自己的工作&#xff0c;提供自己日常工作的效率&#xff0c;自己使用了一段时间下来觉得很有用&#xff0c;于是完善之后开源。如今已经开源近2年&#xff0c;第一个版本是在2020年9月份开源&#xff0c;收获了390个star&#xff0c;后来持续…

用ue4怎么制作一个物体故障闪烁的特效

这是一篇关于电子标牌出现故障时可以使用的毛刺效应的文章。本文将其分解为两个简单的效果&#xff0c;将使用 GIF 来解释它们。 噪音效果 第一个组合是噪音效果。 在 Component Mask 中指定 G 矢量并在 Sine 和 Ceil 中调整 G 值。要将线条更改为水平移动&#xff0c;请在 …

操作系统4小时速成:操作系统的基本概念,它是系统软件,管理处理机、存储器、io设备、文件,并发和共享是最基本特征,还有虚拟和异步

操作系统4小时速成&#xff1a;操作系统的基本概念&#xff0c;它是系统软件&#xff0c;管理处理机、存储器、io设备、文件&#xff0c;并发和共享是最基本特征&#xff0c;还有虚拟和异步 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招…

二叉树的存储结构

引言&#xff1a; 对于二叉树的存储&#xff0c;我们可以采取顺序存储和链式存储结构 顺序存储结构 ● 按编号次序存储节点 • 对树中每个节点进行编号 • 其编号从小到大的顺序就是节点在连续存储单元的先后次序。 我们是从编号为1开始&#xff0c;为了保持数组位序和编号保持…

EMS Advanced Data Import高级数据导入选项Crack版

EMS Advanced Data Import高级数据导入选项Crack版 EMS Advanced Data Import是Dolphi和CBuilder应用。允许您一次以著名的MS Excel、MS Access、DBF、XML、TXT、CSV、ODF和HTML格式输入数据文件。 EMS高级数据导入选项&#xff1a; 导入流行格式信息&#xff1a;S Excel 97-20…

什么是shuffle?shuffle的原理及过程

目录 一、什么是shuffle 二、为什么要引入shuffle&#xff0c;有哪些影响 三、shuffle的工作原理 1、shuffle的阶段 2、shuffle的中间文件 3、Shuffle Write 4、Shuffle Read 四、总结回顾 一、什么是shuffle 类比分公司的人与物和 Spark 的相关概念是这样对应的&#…