环境变量小结

一 常见环境变量介绍

1 PATH


        到了现在,我们也知道我们轻轻敲下ls指令,其实会转为一个可执行文件在运行,也就变成了一个进程,所以ls是让文件运行,./test也是让文件运行,凭什么我们的可执行文件就要加个./(这个./是告诉bashtest文件是在当前的目录下),ls没加路径,进程是怎么知道代码在哪的?

        我们现在用which指令看看ls在哪,噢,ls是在/usr/bin下的一个可执行文件。这意味着我们也可以用usr/bin/ls执行ls指令,就像./test一样。难道说bash记住了ls文件在哪,当我们用的时候,默认去那找?那谁记住ls的路径呢?

        原理就是这个环境变量——PATH,echo打印时要$,告诉echo这是个变量,不然会被当成字符串打印了。PATH变量中有/usr/bin路径,ls等指令运行就会去下面路径里找,找不到就报错。

        所以如果我们把test文件的路径写到PATH变量中,那我们也就可以不带./,直接test就可以运行了。好,怎么加?

        PATH=$PATH:/home/hqy这样/home/hqy下的可执行程序例如a.out就可以不带路径执行了。而且打印显示PATH这个环境变量,也会发现路径添加成功了。 PATH=$PATH:/home/hqy这种方式是追加路径,如果是如下写:PATH=/home/hqy则是覆盖写。

2 HOME

        家目录,就是每个用户进入shell就开始在的目录

        我们su一下,升级为root用户,password是让你输密码,不会会显到显示器,此时HOME也会变。

3 其余环境变量

env显示全部的环境变量。

        HISTIZE=3000是指会保留三千条历史指令,USER保存的当前用户名,然后就是一大段的字母,数字,都是ls的配色方案,ls指令显示目录会有颜色,应该是和这个方案有关。其它就不解释了。

        值得注意的是,cwd不是环境变量,是进程的工作目录,有时候这个进程工作时会产生一些临时文件,这些临时文件要放在进程附近,所以就要记录进程的工作目录,把临时文件放在该目录下,可是我不是已经有环境变量pwd了吗?经过我测试,我觉得有一种场景,例如我在/home路径下去运行其它路径的可执行程序,这个时候的环境变量pwd内是/home,如果没有cwd,那这个可执行程序运行起来后产生的文件难道放在/home下吗,这就有点乱了吧。

4 和环境变量相关的指令

        这里简单介绍几个指令,会用即可,export创建一个环境变量,unset则是取消,env显示全部的环境变量

二 什么是环境变量

        系统提供的具有全局属性的变量。如何体现的全局呢?首先当我们没运行进程的时候,bash可以显示环境变量,而且./test运行形成bash的子进程的时候也能获得环境变量,这是因为环境变量本质是数据,父进程的会共享给子进程,所以不断地父传子,环境变量就存在所有的进程中了,如果谁要修改,发现写时拷贝即可,至于是全部拷贝还是只拷贝一部分,在后续学习页表结构再来解释这个问题。

三 环境变量和进程

        环境变量和我们写的程序文件例如test.c有什么关系呢?我在vs写了这么久的代码,我怎么从来没见过环境变量。要说关系,我们就得先说说main函数的参数了,对,main函数是有参数的,参数如下。

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

        argv看类型好像是个指针数组,那我们打印一下里面的东西,这不是我们输入的命令吗?

这么看来./test 1 2 3会被bash解析为一个个空格隔开的字符串,然后一个个存到一个数组中,最后将数组名传给main函数,好,问题来了,一般函数传参形参没有写参数不是会报错吗,为什么我写了这么多代码没事。简单理解就是main函数是bash起的其它函数调用的,如果一开始发现你main没写参数就不给你传参

        命令行参数是bash根据输入的指令分割的传过去的,意义?可用于选项,做定制化功能。例如ls -l,实际上ls是有多个细分功能的,例如ls -d 显示当前目录,ls - l显示当前目录下的子目录和文件信息,所以为了让使用者能自己选择ls执行的功能,也就有了选项,我们输入指令时,选项可以按空格隔开输入,当然bash的一些指令的选项可以中间无间隙,不知道咋切割的,然后shell会解析这个指令,在ls代码中去匹配要执行的代码块。那和环境变量有什么关系?他们都是main函数的参数。mian函数的第三个参数,env

        env也是个指针数组,打印一看,居然就是环境变量,那看来我们不仅可以通过getenv获取环境变量,还可以通过main函数的参数环境变量表来获取。

    1 #include<stdio.h>
    2 #include <sys/types.h>
    3 #include <unistd.h>
    4 #include<stdlib.h>
    5 int main(int argc , char*argv[],char*env[])
    6 {                                                                                                                                                                                
    7      int j = 0;
    8      for(; env[j]; j++)
    9      {
   10          printf("%s\n",env[j]);
   11      }
   12      return 0;
   13 }

四 其余概念解释

1 环境变量的全局属性

        全局属性是什么意思呢?linux下所有的进程都是bash的子进程,那bash的环境变量就会被子进程共享,这样不断地父传子,只要后续进程不改环境变量,bash的环境变量在所有进程中都能看见,这就是全局属性。

2 内建命令

(1)cd

        有些可执行程序不适合让子进程执行,例如cd命令,本意是改变bash的目录,如果起了个进程去执行,就会改成子进程的工作目录cwd,那就不会影响bash这个父进程的工作目录,在shell的实现上是写一个函数去调用chdir这个系统调用去更改工作目录,然后更新环境变量,不创建子进程,我测试了一下发现,ls显示的是工作目录下的具体信息。我突然就感觉我以为在shell下面cd好像是在各个目录下穿来穿去其实一直在原地踏步,只改变了进程的cwd,然后更新了一下环境变量,ls,pwd显示的时候分别根据cwd,PWD把对应信息显示出来。

(2) echo

        在linux还有种变量叫本地变量,这种变量不会被子进程共享,可是用echo又可以打印本地变量,这好像说明echo也是内建命令,但是系统中的echo要支持重定向,就要让子进程去重定向,免得影响了父进程。(这一点要在后续提到文件和shell实现才能体会得更深刻)

(3)export

        export肯定是给bash自己导环境变量了,如果让子进程执行,那和bash有什么关系。

   

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【爬虫实战】用python爬今日头条热榜TOP50榜单!

一、爬取目标 今天分享一期爬虫案例&#xff0c;爬取的目标是&#xff1a;今日头条热榜的榜单数据。 打开今日头条 首页&#xff0c;在页面右侧会看到头条热榜&#xff0c;如下&#xff1a; 爬取以上6个关键字段&#xff0c;含&#xff1a; 热榜排名,热榜标题,热度值,热榜标…

深度学习 opencv python 公式识别(图像识别 机器视觉) 计算机竞赛

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的数学公式识别算法实现 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学…

网络安全,SSL证书必不可少!

网站劫持是一种非常严重的安全威胁&#xff0c;会直接影响用户体验&#xff0c;甚至直接跳转其他网页&#xff0c;造成客户流失。它可以通过许多方式实现&#xff0c;却可以给企业或者个人网站做出不可逆的危害&#xff0c;以下是一些基本的防止措施建议&#xff1a; 1.使用HT…

【博士每天一篇文献-算法】Modular state space of echo state network

阅读时间&#xff1a;2023-11-2 1 介绍 年份&#xff1a;2013 作者&#xff1a;陈卫彪&#xff0c;华南理工大学计算机科学与工程学院, 期刊&#xff1a;Neurocomputing 引用量&#xff1a;17 本文介绍了一种改进回声状态网络&#xff08;ESN&#xff09;预测性能的新方法。该…

在全志XR806上移植st7789屏幕驱动

前言 很高兴有机会参加本次极术社区举办的“「免费试用」搭载安谋科技STAR-MC1的全志XR806 Wi-FiBLE 开发板试用活动”。 去年就对全志的mcu芯片感兴趣了&#xff0c;一直没有机会接触&#xff0c;看到本次极术社区提供的全志wifi BLE开发板试用&#xff0c;就马上参加了。板…

手把手教你如何扩展(破解)mybatisplus的sql生成 | 京东云技术团队

mybatisplus 的常用CRUD方法 众所周知&#xff0c;mybatisplus提供了强大的代码生成能力&#xff0c;他默认生成的常用的CRUD方法&#xff08;例如插入、更新、删除、查询等&#xff09;的定义&#xff0c;能够帮助我们节省很多体力劳动。 他的BaseMapper中定义了这些常用的C…

gorm的自动化工具gen_已设置图床

gorm的自动化工具gen 官方 https://gorm.io/zh_CN/gen/假设数据库结构如 这里使用gen-tool 安装 go install gorm.io/gen/tools/gentoollatest用法 gentool -hUsage of gentool:-c string配置文件名、默认值 “”、命令行选项的优先级高于配置文件。 -db string指定Driver…

《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)

以下是鼠标绘制矩形最全的一种用法&#xff0c;完整源码将会放在最后面。 QT版本&#xff1a;5.15.2 VS版本&#xff1a;2019 1、在界面加载一张图片 界面的搭建选用QGraphicsView&#xff0c;自定义类GraphicsView继承QGraphicsView&#xff0c;在主程序中点击按钮打开 图片&…

Hello World背后的逻辑

一门语言的开发入门&#xff0c;总是抬手就能整出一个「Hello World Demo」。比如下面这样&#xff1a; 显然&#xff0c;熟悉 iOS 开发的同学都知道&#xff0c;上面这个来自 Objective-C。 今天&#xff0c;我们就从这熟悉的代码入手&#xff0c;来一起研究研究「Hello Worl…

verdi如何打开时可以加载配置比如字体

打开tcl使能 找到配置字体的命令 其实其他有需要的文件配置都可以在这里找到对应的指令 存储文件 新建verdi001.tcl文件 输入想要调整的字体以及大小 verdiSetFont -font "Bitstream Vera Sans" -size "18" verdiSetFont -monoFont "Courier&q…

Kafka JNDI 注入分析(CVE-2023-25194)

Apache Kafka Clients Jndi Injection 漏洞描述 Apache Kafka 是一个分布式数据流处理平台&#xff0c;可以实时发布、订阅、存储和处理数据流。Kafka Connect 是一种用于在 kafka 和其他系统之间可扩展、可靠的流式传输数据的工具。攻击者可以利用基于 SASL JAAS 配置和 SAS…

做哪些副业可以日赚一百?对程序员来说简直不要太容易!

日赚一百&#xff1f;对程序员来说简直不要太容易&#xff01;下面给程序员们推荐一些日赚100的副业&#xff1a; ①外包接单 程序员简单粗暴赚钱的副业之一。 外包接单的类型包括但不限于&#xff1a;软件开发、硬件开发、小程序功能开发、web开发……大到一个系统的开发、…

pip 安装任意软件包报错

现象 使用 pip 命令时提示 查看源码 可以看到是从 pip 包中导入 main失败&#xff0c;点击查看目录 main 文件不见了&#xff0c;判断是文件缺失&#xff0c;重装 pip 即可 # python3 下载 pip curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py # python2 下载…

输入网址到网页显示,期间发生了什么?(收藏篇)

解析url 首先浏览器做的第一步工作就是要对 URL 进行解析&#xff0c;从而生成发送给 Web 服务器的请求信息。对 URL 进行解析之后&#xff0c;浏览器确定了 Web 服务器和文件名&#xff0c;接下来就是根据这些信息来生成 HTTP 请求消息了。 DNS解析 通过浏览器解析 URL 并…

uniapp使用vur-cli新建项目并打包

新建项目 npm install -g vue/cli vue create -p dcloudio/uni-preset-vue my-project选择默认模板npm run dev:h5 运行 安装sass和uview &#xff08;npm安装失败&#xff09; bug&#xff1a;使用uni.scss中的变量或样式&#xff0c;<style lang"scss"> 必…

亚马逊鲲鹏系统六大优势

亚马逊鲲鹏系统六大优势凭借其独特的能力&#xff0c;完全模拟真实的人类行为。只需几个简单的步骤 就可以自由安排任务&#xff0c;让所有账户随时发挥最大的作用。 1、全自动化操作 可以全自动批量注册买家号、AI智能养号、全自动批量测评&#xff0c;模拟人类的操作行为例…

vue-element-admin 集成框架设置中文语言

首先拉取中文版分支代码 https://github.com/PanJiaChen/vue-element-admin/tree/i18n &#xff08;下载卡的话&#xff0c;下载小羊的压缩包&#xff0c;已上传资源&#xff09; \src\lang\index.js 改完dangdangdang可以啦

CSDN中调整图片和文本样式

1.调整图片比例 插入图片后&#xff0c;觉得图片比例不协调&#xff0c;想改小点。只需要在文件后缀加个参数即可&#xff1a;?pic_center 60x。 NOTE&#xff1a;等号左边一定要加个空格&#xff0c;否则格式不生效 2.修改字体颜色 如上 NOTE&#xff1a;等号左边一定要…

Leo赠书活动-07期 【嵌入式虚拟化技术与应用】文末送书

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…

UML与PlantUML简介

UML与PlantUML 1、UML与PlantUML概述2、PlantUML使用 1、UML与PlantUML概述 UML&#xff08;Unified Modeling Language&#xff09;是一种统一建模语言&#xff0c;为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言&#xff0c;独立于任何具体程序设计语言…
最新文章