环境变量小结

news2024/12/23 13:29:39

一 常见环境变量介绍

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.coloradmin.cn/o/1191842.html

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

相关文章

IDEA调试总结

前言 由于 IDEA 每个人使用的版本不同以及快捷键的设置不同&#xff0c;所以忽略了快捷键的使用。如果不知道快捷键请在 IDEA 工具栏里面点开 Run 菜单即可知悉 图标介绍 下面咱们进入看图说话环节&#xff0c;下列图标小伙伴知道是啥功能么&#xff1f;日常开发进行 Debug 使…

Spring-Security前后端分离权限认证

前后端分离 一般来说&#xff0c;我们用SpringSecurity默认的话是前后端整在一起的&#xff0c;比如thymeleaf或者Freemarker&#xff0c;SpringSecurity还自带login登录页,还让你配置登出页,错误页。 但是现在前后端分离才是正道&#xff0c;前后端分离的话&#xff0c;那就…

React状态管理方案盘点

您好&#xff0c; 如果喜欢我的文章或者想上岸大厂&#xff0c;可以关注公众号「量子前端」&#xff0c;将不定期关注推送前端好文、分享就业资料秘籍&#xff0c;也希望有机会一对一帮助你实现梦想 前言 本文不会介绍各个状态管理工具的具体使用或者如何二次封装&#xff0c…

自动驾驶系统激光雷达传感器反射率标定板

自动驾驶技术正在全球范围内快速发展和推广。在中国&#xff0c;自动驾驶技术也得到了高度重视和大力支持。中国政府已经出台了一系列政策&#xff0c;推动自动驾驶技术的发展和应用。例如&#xff0c;上海、北京等地已经开放了自动驾驶测试道路&#xff0c;并开展了自动驾驶公…

选择CRM系统主要看哪些指标?

很多企业都想选择一款好用的CRM客户管理系统&#xff0c;但是面对众多类型、品牌的CRM却犯了难。下面我们来说说&#xff0c;企业要想选到一款适合自己的、好用的CRM系统&#xff0c;主要看哪些指标&#xff1f;这里有6个步骤&#xff0c;可以帮您做到。 第1步&#xff1a;了解…

亚马逊鲲鹏系统六大优势

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

亚马逊鲲鹏系统能做什么

亚马逊鲲鹏系统是一款能绕过亚马逊智能检测&#xff0c;完全模拟人类真实行为&#xff0c;通过模拟真实的人流量来帮助你提升你的产品排名&#xff0c;让你的产品出现在搜索首页&#xff0c;从而快速提高你的销售业绩的营销工具&#xff01; 主要的功能有批量注册买家号、AI智能…

微服务概念

微服务 微服务是什么 In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource A…

node插件MongoDB(四)—— 库mongoose 的文档操作使用

文章目录 前言&#xff08;1&#xff09;问题&#xff1a;安装的mongoose 库版本不应该过高导致的问题&#xff08;2&#xff09;重新安装低版本 一、插入文档1. 代码2. node终端效果3. 使用mongo.exe查询数据库的内容 二、删除文档1. 删除一条2. 批量删除3. 代码 前言 &#…

新方向!文心一言X具身智能,用LLM大模型驱动智能小车

具身智能已成为近年来研究的热点领域之一。具身智能强调将智能体与实体环境相结合&#xff0c;通过智能体与环境的交互&#xff0c;来感知和理解世界&#xff0c;最终实现在真实环境中的自主决策和运动控制。 如何基于文心大模型&#xff0c;低成本入门“具身智能”&#xff0…

社区团购小程序系统源码+各种快递代收+社区便利店 带完整的搭建教程

社区团购小程序系统源码的开发背景可以追溯到近年来电商行业的快速发展&#xff0c;特别是在新冠疫情的影响下&#xff0c;线上购物在全球范围内得到了更广泛的普及和使用。社区团购作为一种新兴的电商模式&#xff0c;结合了传统团购和社交电商的优点&#xff0c;通过线上平台…

jQuery中淡入与淡出

在我们jQuery中为我们封装了很多好玩的方法&#xff0c;我为大家介绍一下淡入与淡出&#xff01; 我们需要配合事件来玩淡入淡出 淡出语法&#xff1a;fadeOut([speed,[easing],[fn]) (1)参数都可以省略 (2)speed:三种预定速度之一的字符串(“slow”“normal”or “fast”)或…

QML8、布局元素

布局元素(Layout Items) QML使用anchors(锚)对元素进行布局。anchoring(锚定)是基础元素对象的基本属性,可以被所有的可视化QML元素使用。一个anchors(锚)就像一个协议,并且比几何变化更加强大。Anchors(锚)是相对关系的表达式,你通常需要与其它元素搭配使用。 一…

如何理解CDN?说说实现原理?

面试官&#xff1a;如何理解CDN&#xff1f;说说实现原理&#xff1f; 一、是什么 CDN (全称 Content Delivery Network)&#xff0c;即内容分发网络 构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分…

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

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

Spring boot 整合grpc 运用

文章目录 GRPC基础概念&#xff1a;Protocol Buffers&#xff1a;proto 基础语法&#xff1a;调用类型&#xff1a; Spring boot 整合 grpc项目结构&#xff1a;整合代码&#xff1a;父 pomproto 模块服务端&#xff1a;客户端&#xff1a;实际调用&#xff1a; 原生集成 GRPC基…

振南技术干货集:C语言的一些“骚操作”及其深层理解(3)

注解目录 第二章《c语言的一些“操作”及其深层理解》 一、字符串的实质就是指针 &#xff08;如何将 35 转为对应的十六进制字符串”0X23”&#xff1f;&#xff09; 二 、转义符\ &#xff08;打入字符串内部的“奸细”。&#xff09; 三、字符串常量的连接 &#xff…

介绍YOLO-NAS Pose:姿势估计的技术

YOLO-NAS 姿势 YOLO-NAS Pose models是对 Pose Estimation 领域的最新贡献。今年早些时候,Deci 因其突破性的目标检测基础模型 YOLO-NAS 获得了广泛认可。在 YOLO-NAS 成功的基础上,该公司现在推出了 YOLO-NAS Pose 作为其姿势估计的对应产品。该姿势模型在延迟和准确性之间…

FinClip 产品10月报:官网新增PC终端麒麟版、UOS版下载

FinClip 的使命是使您&#xff08;业务专家和开发人员&#xff09;能够通过小程序解决关键业务流程挑战&#xff0c;并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点&#xff0c;看看是否有助于您实现目标。 产品方面的相关动向&#x1f447;&#x1f…

拆分代码 + 动态加载 + 预加载,减少首屏资源,提升首屏性能及应用体验

github 原文地址 我们看一些针对《如何提升应用首屏加载体验》的文章&#xff0c;提到的必不可少的措施&#xff0c;便是减少首屏幕加载资源的大小&#xff0c;而减少资源大小必然会想到按需加载措施。本文提到的便是一个基于webpack 插件与 react 组件实现的一套研发高度自定…