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

Linux学习记录——십일 环境变量

文章目录

  • 1、认识
  • 2、通过代码获取环境变量
    • 1、手动获取
    • 2、函数获取
  • 3、重新认识环境变量


1、认识

在云服务器上写程序时,最终的执行需要./文件名,点表示当前目录,/是文件分隔符,之后就会打印程序,这是用户的操作;而系统则不必这样做,这是因为系统有环境变量的支持。环境变量中有个常见的PATH,查看环境变量用这个指令echo $。执行就会出现一个路径,也就是PATH的路径,我们写的程序由于不在这个路径里,自然也就无法自动执行,所以需要用户自己指定路径。而系统命令,比如ls,用which ls查看路径,发现它的路径可以在PATH的路径里找到,所有调用ls时不需要指定路径。

要在PATH里添加自己的路径的话,命令:export PATH=$PATH:路径。这样可以不改变原有路径而添加新路径。当然也可以用cp -rf 文件名 /usr/bin指令把路径拷贝过去,也可以在系统目录里查看到。

实际上像这样把可执行程序拷贝到系统默认路径下就相当于Linux的软件安装。而卸载,rm /usr/bin/文件名 -rf,就是删除路径。

通过以上例子,可以这样理解环境变量:它是由系统维护的,在特殊场景的变量。环境变量可以帮助编译器编译用户写的代码。

常见的环境变量:

PATH:指定命令的搜索路径
HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL:当前Shell,它的值通常是/bin/bash。

想查看某一个环境变量的话, echo $环境变量名 ,查看系统环境变量的话,env即可。

很多系统展现出来的规定都是依靠环境变量去实现的。

和环境变量相关的命令:
1、echo: 显示某个环境变量值
2.export : 设置一个新的环境变量
3、env:显示所有环境变量
4、unset:清除环境变量
5、set:显示本地定义的shell变量和环境变量

2、通过代码获取环境变量

1、手动获取

int main(int argc, char* argv[], char* envvp[])
{//envp就是环境变量的指针数组,每一个指向一个字符串,最后一个指向字符串的指针的下一项会指向NULLfor(int i = 0; envo[i]; i++){printf("envp[%d]->%s\n", i, envp[i]);}return 0;
}

通过这个程序打印出来的就是传递给当前进程的环境变量表。每个字符串就是环境变量字符串。

假如不传参,我们也可以拿到环境变量。environ是一个全局变量,char**类型,相当于char* []。

int main()
{  extern char** environ;for(int i = 0; environ[i]; i++){printf("environ[%d]->%s\n", i, environ[i]);}return 0;
}

2、函数获取

但环境变量不需要用户自己去遍历。使用特定的函数可以获取。getenv函数,可根据变量名获取变量。这个需要头文件<stdlib.h>。

int main()
{char* user = getenv("USER");if(user == NULL) perror("getenv");else printf("USER: %s\n", user);return 0;
}

把user换成pwd,pwd这个指令也就写好了,如果把当前目录放到根目录下,export PATH=$PATH:路径,那么pwd和自己写的pwd查看到的都只有一个/。

如果想让写的这个程序只有自己可以执行:

#define NAME "zyd"
int main()
{char* own = getenv("USER");if(strcmp(own, NAME) == 0){printf("程序正常执行");}else{printf("当前用户%s非本人,不能运行\n", own);}return 0;
}

3、重新认识环境变量

环境变量本质上是一个内存级的一张表,这张表由用户在登陆系统的时候,进行给特定用户形成属于自己的环境变量表。每一个环境变量都有自己的应用场景。每一个元素都是kv的。

我们手动改环境变量时,再次运用变量会被改变,而重启一下就恢复正常了。环境变量再没有存入数据的时候,它放在系统的配置文件。在根目录下,ls -al,看到.bash_profile和.bashrc,这两个文件就是shell脚本,里面存放配置文件。

环境变量是在哪里建立的?启动Xshell后,内存会开一个Xshell进程,这个进程会读取命令和命令行,并且加载进环境变量这个表;当我们export一行代码后,比如a=‘!!!’,系统就会把它读成一个字符串"a=‘!!!’",并且由表中空着的指针去指向这个字符串,再重新设定NULL, 当然空间不够就扩容。而创建子进程后,作为父进程,环境变量就会被传到子进程里。环境变量是由bash整理的。

在程序文件里,可以写printf(“myenv: %s\n”, getenv(“a”)); 运行成功后,我们就可以看到自己搞的这个变量。

改环境变量用export是因为这样才可以继承到子进程,如果不加export,也可以写成功,但这将会是shell的本地变量,只在shell内部有效,我们写一个程序文件去调用它无法调用,这样的解决办法就是export 变量名就可,因为它已经被建立了,这时候export就是把本地变量添加到表里了。

之后的博客中还会深入一下环境变量。但这篇也基本全了。

结束。

相关文章:

Linux学习记录——십일 环境变量

文章目录1、认识2、通过代码获取环境变量1、手动获取2、函数获取3、重新认识环境变量1、认识 在云服务器上写程序时&#xff0c;最终的执行需要./文件名&#xff0c;点表示当前目录&#xff0c;/是文件分隔符&#xff0c;之后就会打印程序&#xff0c;这是用户的操作&#xff…...

【人工智能 Open AI 】我们程序员真的要下岗了- 全能写Go / C / Java / C++ / Python / JS 人工智能机器人

文章目录[toc]人工智能 AI Code 写代码测试用golang实现冒泡排序用golang实现计算环比函数goroutine and channel用golang实现二叉树遍历代码用golang实现线程安全的HashMap操作代码using C programming language write a tiny Operation Systemuse C language write a tiny co…...

STM32 EXTI外部中断

本文代码使用 HAL 库。 文章目录前言一、什么是外部中断&#xff1f;二、外部中断中断线三、STM32F103的引脚复用四、相关函数&#xff1a;总结前言 一、什么是外部中断&#xff1f; 外部中断 是单片机实时地处理外部事件的一种内部机制。当某种外部事件发生时&#xff0c;单片…...

Mapper代理开发——书接MaBatis的简单使用

在这个mybatis的普通使用中依旧存在硬编码问题,虽然静态语句比原生jdbc都写更少了但是还是要写&#xff0c;Mapper就是用来解决原生方式中的硬编码还有简化后期执行SQL UserMapper是一个接口&#xff0c;里面有很多方法&#xff0c;都是一一和配置文件里面的sql语句的id名称所对…...

实体对象说明

1.工具类层Utilutil 工具顾明思义&#xff0c;util层就是存放工具类的地方&#xff0c;对于一些独立性很高的小功能&#xff0c;或重复性很高的代码片段&#xff0c;可以提取出来放到Util层中。2.数据层POJO对象&#xff08;概念比较大&#xff09; 包含了以下POJO plain ord…...

JAVA中加密与解密

BASE64加密/解密 Base64 编码会将字符串编码得到一个含有 A-Za-z0-9/ 的字符串。标准的 Base64 并不适合直接放在URL里传输&#xff0c;因为URL编码器会把标准 Base64 中的“/”和“”字符变为形如 “%XX” 的形式&#xff0c;而这些 “%” 号在存入数据库时还需要再进行转换&…...

改进YOLO系列 | ICLR2022 | OMNI-DIMENSIONAL DYNAMIC CONVOLUTION: 全维动态卷积

单个静态卷积核是现代卷积神经网络(CNNs)的常见训练范式。然而,最近的动态卷积研究表明,学习加权为其输入依赖注意力的n个卷积核的线性组合可以显著提高轻量级CNNs的准确性,同时保持高效的推理。然而,我们观察到现有的作品通过卷积核空间的一个维度(关于卷积核数量)赋予…...

信息收集之Github搜索语法

信息收集之Github搜索语法1.Github的搜索语法2.使用 Github 进行邮件配置信息收集3.使用Github进行数据库信息收集4.使用Github进行 SVN 信息收集5.使用Github进行综合信息收集在测试的信息收集阶段&#xff0c;可以去Github和码云上搜索与目标有关的信息&#xff0c;或者就有意…...

【案例教程】拉格朗日粒子扩散模式FLEXPART

拉格朗日粒子扩散模式FLEXPART通过计算点、线、面或体积源释放的大量粒子的轨迹&#xff0c;来描述示踪物在大气中长距离、中尺度的传输、扩散、干湿沉降和辐射衰减等过程。该模式既可以通过时间的前向运算来模拟示踪物由源区向周围的扩散&#xff0c;也可以通过后向运算来确定…...

试题 算法训练 自行车停放

问题描述 有n辆自行车依次来到停车棚&#xff0c;除了第一辆自行车外&#xff0c;每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车&#xff0c;从左到右编号为&#xff1a;3,5,1。现在编号为2的第4辆自行车要停在5号自行车的左…...

泛型与Map接口

Java学习之道 泛型 泛型这种参数类型可以用在类、方法和接口中&#xff0c;分别被称为泛型类&#xff0c;泛型方法&#xff0c;泛型接口 参数化类型&#xff1a;将类型由原来的具体的类型参数化&#xff0c;在使用/调用时传入具体的类型JDK5引入特性提供了安全检测机制&#xf…...

Unity Bug记录本

//个人记录&#xff0c;持续更新 1、将此代码挂载到空脚本上&#xff1a; bool flag (object)GetComponent<Camera>() null; bool flag1 (object)GetComponent<Text>() null; Debug.Log(flag"::"flag1); //输出结果&#xff1a;False::True bool…...

B. The Number of Products)厉害

You are given a sequence a1,a2,…,ana1,a2,…,an consisting of nn non-zero integers (i.e. ai≠0ai≠0). You have to calculate two following values: the number of pairs of indices (l,r)(l,r) (l≤r)(l≤r) such that al⋅al1…ar−1⋅aral⋅al1…ar−1⋅ar is neg…...

一起Talk Android吧(第五百一十二回:自定义Dialog)

文章目录整体思路实现方法第一步第二步第三步第四步各位看官们大家好&#xff0c;上一回中咱们说的例子是"自定义Dialog主题",这一回中咱们说的例子是" 自定义Dialog"。闲话休提&#xff0c;言归正转&#xff0c; 让我们一起Talk Android吧&#xff01;整体…...

GinVueAdmin源码分析3-整合MySQL

目录文件结构数据库准备配置文件处理config.godb_list.gogorm_mysql.gosystem.go初始化数据库gorm.gogorm_mysql.go开始初始化测试数据库定义实体类 Userserviceapi开始测试&#xff01;文件结构 本文章将使用到上一节创建的 CommonService 接口&#xff0c;用于测试连接数据库…...

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——MapReduce开发总结

在编写MapReduce程序时&#xff0c;需要考虑如下几个方面&#xff1a; 1、输入数据接口&#xff1a;InputFormat 默认使用的实现类是&#xff1a;TextInputFormatTextInputFormat的功能逻辑是&#xff1a;一次读一行文本&#xff0c;然后将该行的起始偏移量作为key&#xff0…...

requests---(4)发送post请求完成登录

前段时间写过一个通过cookies完成登录&#xff0c;今天我们写一篇通过post发送请求完成登录豆瓣网 模拟登录 1、首先找到豆瓣网的登录接口 打开豆瓣网站的登录接口&#xff0c;请求错误的账号密码&#xff0c;通过F12或者抓包工具找到登录接口 通过F12抓包获取到请求登录接口…...

Python抓取数据具体流程

之前看了一段有关爬虫的网课深有启发&#xff0c;于是自己也尝试着如如何过去爬虫百科“python”词条等相关页面的整个过程记录下来&#xff0c;方便后期其他人一起来学习。 抓取策略 确定目标&#xff1a;重要的是先确定需要抓取的网站具体的那些部分&#xff0c;下面实例是…...

【Python学习笔记】第二十四节 Python 正则表达式

一、正则表达式简介正则表达式&#xff08;regular expression&#xff09;是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。正则表达式是对字符串&#xff08;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特…...

数字逻辑基础:原码、反码、补码

时间紧、不理解可以只看这里的结论 正数的原码、反码、补码相同。等于真值对应的机器码。 负数的原码等于机器码&#xff0c;反码为原码的符号位不变&#xff0c;其余各位按位取反。补码为反码1。 三种码的出现是为了解决计算问题并简化电路结构。 在原码和反码中&#xff0c;存…...

有限差分法-差商公式及其Matlab实现

2.1 有限差分法 有限差分法 (finite difference method)是一种数值求解偏微分方程的方法,它将偏微分方程中的连续变量离散化为有限个点上的函数值,然后利用差分逼近导数,从而得到一个差分方程组。通过求解差分方程组,可以得到原偏微分方程的数值解。 有限差分法是一种历史…...

高校就业信息管理系统

1引言 1.1编写目的 1.2背景 1.3定义 1.4参考资料 2程序系统的结构 3登录模块设计说明一 3.1程序描述 3.2功能 3.3性能 3.4输人项 3.5输出项 3.6算法 3.7流程逻辑 3.8接口 3.10注释设计 3.11限制条件 3.12测试计划 3.13尚未解决的问题 4注册模块设计说明 4.…...

【Java|golang】2373. 矩阵中的局部最大值

给你一个大小为 n x n 的整数矩阵 grid 。 生成一个大小为 (n - 2) x (n - 2) 的整数矩阵 maxLocal &#xff0c;并满足&#xff1a; maxLocal[i][j] 等于 grid 中以 i 1 行和 j 1 列为中心的 3 x 3 矩阵中的 最大值 。 换句话说&#xff0c;我们希望找出 grid 中每个 3 x …...

根据指定函数对DataFrame中各元素进行计算

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】根据指定函数对DataFrame中各元素进行计算以下错误的一项是?import numpy as npimport pandas as pdmyDict{A:[1,2],B:[3,4]}myDfpd.DataFrame(myDict)print(【显示】myDf)print(myDf)print(【…...

【蓝桥杯集训·每日一题】AcWing 3502. 不同路径数

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴一、题目 1、原题链接 3502. 不同路径数 2、题目描述 给定一个 nm 的二维矩阵&#xff0c;其中的每个元素都是一个 [1,9] 之间的正整数。 从矩阵中的任意位置出发&#xf…...

Java - 数据结构,二叉树

一、什么是树 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a; 1、有…...

模拟QQ登录-课后程序(JAVA基础案例教程-黑马程序员编著-第十一章-课后作业)

【案例11-3】 模拟QQ登录 【案例介绍】 1.案例描述 QQ是现实生活中常用的聊天工具&#xff0c;QQ登录界面看似小巧、简单&#xff0c;但其中涉及的内容却很多&#xff0c;对于初学者练习Java Swing工具的使用非常合适。本案例要求使用所学的Java Swing知识&#xff0c;模拟实…...

【壹】嵌入式系统硬件基础

随手拍拍&#x1f481;‍♂️&#x1f4f7; 日期: 2023.2.28 地点: 杭州 介绍: 日子像旋转毒马&#x1f40e;&#xff0c;在脑海里转不停&#x1f92f; &#x1f332;&#x1f332;&#x1f332;&#x1f332;&#x1f332; 往期回顾 &#x1f332;&#x1f332;&#x1f332…...

当参数调优无法解决kafka消息积压时可以这么做

今天的议题是&#xff1a;如何快速处理kafka的消息积压 通常的做法有以下几种&#xff1a; 增加消费者数增加 topic 的分区数&#xff0c;从而进一步增加消费者数调整消费者参数&#xff0c;如max.poll.records增加硬件资源 常规手段不是本文的讨论重点或者当上面的手段已经使…...

Java线程池源码分析

Java 线程池的使用&#xff0c;是面试必问的。下面我们来从使用到源码整理一下。 1、构造线程池 通过Executors来构造线程池 1、构造一个固定线程数目的线程池&#xff0c;配置的corePoolSize与maximumPoolSize大小相同&#xff0c; 同时使用了一个无界LinkedBlockingQueue存…...

wordpress为什么运行缓慢/sem和seo是什么职业

场景&#xff1a;Twitter情感分析 许多客户使用社交媒体来谈论产品和服务。Twitter也不例外。充满意见的推文可以传播&#xff0c;并极大地影响您的产品&#xff08;和公司&#xff09;的声誉。因此&#xff0c;在我们的示例场景中&#xff0c;让我们假设我们是一家区域性零售…...

做夏促的网站有哪些/百度网盘登录

要理解SG函数&#xff0c;首先要先知道SG的定理&#xff1a;Sprague-Grudy定理&#xff1a; 令N {0, 1, 2, 3, ...} 为自然数的集合。Sprague-Grundy 函数给游戏中的每个状态分配了一个自然数。结点v的Grundy值等于没有在v的后继的Grundy值中出现的最小自然数. 形式上&#xf…...

做视频网站公司要怎么做/seo网站优化培训多少价格

如果任务是计算密集型的操作&#xff0c;那么建议使用Stream接口&#xff0c;因为计算密集&#xff0c;意味着对cpu的使用率高&#xff0c;创建过多的线程反而会引起频繁的上下文切换&#xff0c;这时候使用与处理器核数相同的线程数&#xff0c;可能就是性能最大的选择&#x…...

顺德公司网站制作/广西南宁做网站的公司

在C#里面&#xff0c;属性的get 与 set 非常简单方便。 public class bird {public int age { get;set; } public bool isadult{get {return this.age > 1 ? true:false;}} }而在Python里面&#xff0c;属性可以直接获取或赋值。但是如果在获取或赋值时加一些逻辑判断&am…...

dw动态网站怎么做搜索框/常见的网络营销方式有哪些

只要能存储数据的器件都可以称之为存储器&#xff0c;它的含义覆盖了寄存器&#xff0c;缓存&#xff0c;内存&#xff0c;硬盘。 cpu访问快慢的速度依次为:寄存器-> 缓存->内存->硬盘 寄存器&#xff08;register&#xff09;是中央处理器的组成部分&#xff0c;是…...

wordpress主题大前端dux去授权/免费网站制作成品

什么是守护线程 守护线程的作用是为用户线程提供服务的&#xff0c;且仅在用户线程运行时才需要。当所有用户线程完成执行后&#xff0c;JVM就会终止&#xff0c;也就是说&#xff0c;守护线程会自动退出。但是守护线程并不是 100% 不能阻止 JVM 退出的。守护线程中设计不良的…...