当前位置: 首页 > news >正文

Linux进程——环境变量之二

文章目录

    • 环境变量
      • 查看环境变量
      • 获取环境变量
      • main()的第三个参数
      • 本地变量
      • 全局环境变量
      • 内建命令与常规命令

环境变量

查看环境变量

在上一篇文章中我们只说了查看某个环境变量的值,那么如何查看所有的环境变量呢

使用指令env即可

例如

QQ_1721910604069.png

这里我们也不需要全部记住,只需要记住一些比较常见的

  1. PWD
    这个环境变量就是给pwd指令的结果了
  2. HOME
    这里对应的就是cd ~命令了,找到家在哪里

那其实在我们登录Xshell时,他所做的工作就是认证信息,将bash加载到内存,形成进程,根据用户名初始化环境变量,进入家目录

这样我们其实就能理解为什么当我们直接改环境变量值的之后,直接重启Xshell就能恢复了,因为每一次都要重新加载初始化

获取环境变量

那么在C语言中是如何获取环境变量呢

就是使用getenv()函数即可,返回值即为环境变量的值,参数是环境变量名称

例如

char* ret = NULL;
ret = getenv("PATH");

main()的第三个参数

我们之前说了main的前两个参数,表示命令行参数表

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

这里的第三个参数其实就是环境变量的指针数组,他指向的就是环境变量表

我们可以像之前一样循环打印看看环境变量

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

本地变量

我们可以在bash中直接定义环境变量,直接使用等号即可

环境变量=值

然后使用echo $环境变量就能查看了

但是我们自己定义的变量本质上是本地的,使用env是查不到的

但如果我们想要定义的环境变量被放在系统中的变量中,就需要export 环境变量名

全局环境变量

在上面的一系列介绍中,我们很容易产生一种感觉,分为临时的本地变量和全局的环境变量,事实上也就是如此

在修改或者定义环境变量时,我们只修改了bash进程中的环境变量,当我们重新登录之后,bash又恢复成原来的样子了

这时因为bash解释器会从bash_profile文件中初始化环境变量

也就是说,如果我们想要彻底将一个环境变量保存,就需要保存到他的配置文件当中

QQ_1721912108865.png

并且我们联系之前的知识,由父进程创建的进程会采用写时拷贝的方式来达到共用的目的,也就是说父进程的环境变量可以被子进程使用

这也就是说环境变量具有全局性

在c语言中其实也算是这样,我们可以使用extern来声明外部环境变量

内建命令与常规命令

我们知道bash的命令不用加上路径是因为他存在环境变量PATH里了

但如果我们将PATH置空,这些命令自然也就不能运行了,但是有一些指令,比如说pwd、echo,仍然可以正常运行

这主要是因为Linux的指令分为两类,一类是bash创建子进程执行的,称之为常规命令,另一类是bash自己执行的,相当于调用一个函数,称之为内建命令

相关文章:

  • 【计算机网络】WireShark和简单http抓包实验
  • 软考:软件设计师 — 5.计算机网络
  • Git 从入门到精通:全面掌握版本控制(IntelliJ IDEA 中 Git 的使用指南)
  • 【LeetCode 随笔】C++入门级,详细解答加注释,持续更新中。。。
  • 【ESP32 IDF 软件模拟SPI驱动 W25Q64存储与读取数组】
  • 二、【Python】入门 - 【PyCharm】安装教程
  • C语言程序设计(二)
  • 疫情居家办公OA系统
  • 富芮坤FR800X系列之按键检测模块设计
  • 正则表达式概述
  • Django—admin后台管理
  • Java 实现分页的几种方式详解
  • MySQL之索引优化
  • 单片机主控的基本电路
  • Dav_笔记11:SQL Tuning Overview-sql调优 之 4
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【node学习】协程
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Facebook AccountKit 接入的坑点
  • HashMap剖析之内部结构
  • Java,console输出实时的转向GUI textbox
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript 基本功--面试宝典
  • Linux中的硬链接与软链接
  • Map集合、散列表、红黑树介绍
  • SpringBoot 实战 (三) | 配置文件详解
  • 反思总结然后整装待发
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 终端用户监控:真实用户监控还是模拟监控?
  • 正则表达式-基础知识Review
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ​VRRP 虚拟路由冗余协议(华为)
  • ‌前端列表展示1000条大量数据时,后端通常需要进行一定的处理。‌
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #微信小程序:微信小程序常见的配置传值
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (10)ATF MMU转换表
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (十六)视图变换 正交投影 透视投影
  • (四)js前端开发中设计模式之工厂方法模式
  • (五)IO流之ByteArrayInput/OutputStream
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .Net CF下精确的计时器
  • .net core 管理用户机密
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .NET中使用Protobuffer 实现序列化和反序列化