【Linux系统编程】环境变量

介绍

        环境变量是一个系统预定义的全局参数,系统自己开辟空间,将它存在于所有的Shell中,具有继承性,可以存储有关shell会话和工作环境的信息。

        环境变量不是只有一个,而是一堆,是系统内具有特殊用途的变量。如:PATH、PWD、USER、HOME等。


环境变量的认识

        首先,要说明,每当启动系统时,环境变量就已被系统开辟完毕,我们可使用env指令进行查看系统下的所有环境变量以及环境变量对应的数据。

[zhujunhao@bogon code]$ env
........

USER=zhujunhao

PATH=.........

PWD=/home/zhujunhao/code

HOME=/home/zhujunhao
........

        查看单个环境变量的数据时,只需输入:echo $环境变量。如echo $PATH、echo $PWD等。

[zhujunhao@bogon code]$ echo $USER
zhujunhao   
[zhujunhao@bogon code]$ echo $PWD
/home/zhujunhao/code

        我们也可以创建环境变量。在Linux中,export命令用于创建环境变量,如export ENV=12,创建存放12的环境变量。

[zhujunhao@bogon code]$ export ENV=12
[zhujunhao@bogon code]$ echo $ENV
12

        每个环境变量对应的数据就是其功能的代表,它具有特殊的意义,下面会详细介绍其功能。


命令行参数

       在认识环境变量的功能前,我们来学习一下命令行参数。在Linux中,在我们启动的非图形化界面时的命令行时,实际上就是bash(或shell)给我们输出的命令行字符串,对应的小部分代码样例如下:

printf("[zhujunhao@bogon code]$ ");//输出指令行,不同机器的数据可能有些不同
char buffer[1024];//指令数组,存入相关指令的字符串

scanf("%s, buffer");//从输入流中输入指令

        该命令行还可以与我们写入的代码程序联系起来。在平常我们写入C/C++程序时,主函数中其实也可以有参数。main主函数中的参数是从bash指令行中维护、创建、传参,即这些参数通常在命令行中传递给程序,并可以通过main函数的参数进行访问。样例如下:

int main(int n, char* news[],char* S[]) //其中,第一个整型参数n表示命令行参数的数量。第二个参数news是一个指向命令行参数字符串数组的指针,命令行中输入的字符串都将放入里面。第三个参数S存放的就是系统下的环境变量

        我们先来观察前两个参数的使用当我们在命令行中运行程序时,输入的参数将会传递给程序,下面的代码是依次访问输入数据的代码。如下:

[zhujunhao@bogon code]$ cat test.cpp

#include <iostream>
#include <cstdio>
using namespace std;
int main(int n, char* news[])
{
    /*int i = 0;
    for (i = 0; i < n; i++)
    {
        cout << "news[" << i << "]: " << news[i] << endl;
    }*/

    //以下效果一样
    for (int i = 0; news[i]; i++)
    {
        cout << "news[" << i << "]: " << news[i] << endl;
    }
    return 0;
}

[zhujunhao@bogon code]$ g++ -o test.exe test.cpp

//以下是输出指令行中的内容
[zhujunhao@bogon code]$ ./test.exe
news[0]: ./test.exe  

[zhujunhao@bogon code]$ ./test.exe -a -b -c -d -e
news[0]: ./test.exe
news[1]: -a
news[2]: -b
news[3]: -c
news[4]: -d
news[5]: -e

        这种使用通常在命令代码中最常见,通过不同选项,让相同的程序执行内部不同的功能。在bash的指令中,运用的其实就是上面的道理来实现命令逻辑,即命令行参数是指令选项的基础。

[zhujunhao@bogon code]$ cat code.cpp   //系统的源代码
#include <iostream>
#include <cstring>
using namespace std;
int main(int n, char *s[])
{
    if (n != 2)
    {
        cout << "Error:\n\tPlease Inoput" << endl;
    }
    else if (strcmp("-1", s[1]) == 0)
    {
        cout << "test.exe: -1" << endl;
    }
    else if (strcmp("-2", s[1]) == 0)
    {
        cout << "test.exe: -2" << endl;
    }
    else if (strcmp("-3", s[1]) == 0)
    {
        cout << "test.exe: -3" << endl;
    }
    else
    {
        cout << "unknow" << endl;
    }
    return 0;   
}

[zhujunhao@bogon code]$ g++ -o code.exe code.cpp
[zhujunhao@bogon code]$ ./code.exe
Error:
    Please Inoput

//下面的-1、-2、-3、-4可理解为对应设计的选项功能,而./code.exe为设计对应的命令
[zhujunhao@bogon code]$ ./code.exe -1 
test.exe: -1
[zhujunhao@bogon code]$ ./code.exe -2
test.exe: -2
[zhujunhao@bogon code]$ ./code.exe -3
test.exe: -3
[zhujunhao@bogon code]$ ./code.exe -4
unknow

        main函数中存放环境变量的第三个参数使用样例如下,该代码的功能是输出系统下的所有环境变量,也就是说,环境变量可以被子进程进行下去。

[zhujunhao@bogon code]$ cat test.cpp

//以下代码的S2[i]将会输出所有的环境变量

#include <iostream>
using namespace std;
int main(int n, char *S1[], char *S2[])
{
    for (int i = 0; S2[i]; i++)
    {
        cout << "S2[" << i << "]:  " << S2[i] << endl;
    }
    return 0;
}

        在代码中,我们可使用getenv("环境变量")函数获取指定名字的环境变量,获取成功的话将返回环境变量的数据。

[zhujunhao@bogon code]$ cat test.cpp

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
    char* str = getenv("USER");
    cout << "str(USER): " << str << endl;
    return 0;
}

[zhujunhao@bogon code]$ g++ -o test.exe test.cpp
[zhujunhao@bogon code]$ ./test.exe
str(USER): zhujunhao     


环境变量的作用

        环境变量可以很好的帮助系统、用户、应用程序和脚本进行配置和运行。系统下的环境变量非常多,这里我们先认识下PATH、PWD、USER、HOME的功能。

        PATH:它告诉shell或bash进程在哪里查找可执行文件。当你在命令行中输入一个命令时,shell会在PATH变量指定的目录中查找该命令的可执行文件。

        PWD:存放这当前目录的绝对路径,对应的指令功能是pwd。

        USER:它表示当前shell或bash登录的用户。当用户登录系统时,系统会设置USER环境变量为该用户的用户名。这个环境变量在系统运行时始终运转,即使我们在中间切换用户,USER环境变量的值仍然会保持为原来的用户名。

        HOME:它表示当前用户的家目录的路径。当用户登录系统时,系统会设置HOME环境变量为该用户的家目录路径。跟USER一样,这个环境变量在系统运行时始终运转。

        下面,我们重点说明下PATH环境变量。

        当我们使用指令时,系统都会展开 PATH 对应下的路径进行搜索相关指令,所以无论在什么路径下,系统相关的指令都可以使用。而没有在此路径下的指令需根据具体路径来执行。

        若想将有关指令跟系统定义相关指令那样,不用加路径可在任意路径下直接使用,这里有两个方法。

        方法一:直接把相关指令拷贝到 PATH 对应的 /usr/bin/ 工作命令路径下。

[zhujunhao@bogon code]$ echo $PATH  

//系统在以下路径进行查找,每个分隔符对应不同的路径
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/zhujunhao/.local/bin:/home/zhujunhao/bin

[zhujunhao@bogon code]$ code.exe   //不是系统中PATH路径下对应的指令,系统报错
bash: code.exe: command not found...

[zhujunhao@bogon code]$ ./code.exe  //绝对路径下执行可执行文件的指令
Error:
    Please Inoput

//拷贝自己的指令

[zhujunhao@bogon code]$ sudo cp code.exe /usr/bin/
[sudo] password for zhujunhao: 

//可直接成功运行
[zhujunhao@bogon code]$ code.exe
Error:
    Please Inoput

        这里需提醒一下,除非我们必要使用,否则不建议把相关指令拷贝系统指令的 PATH 路径下,因为当 PATH 路径下存放过多时,会给系统造成一定的影响。

       方法二:直接把自己当前的路径添加到 PATH 这个环境变量里,具体添加如下:

[zhujunhao@bogon code]$ pwd
/home/zhujunhao/code

//下面是错误的写法
[zhujunhao@bogon code]$ PATH=/home/zhujunhao/code  //这样将会把原有的环境变量直接覆盖

//下面才是真正的添加路径的正确写法,这里/home/zhujunhao/code对应的是我们要设置的路径
[zhujunhao@bogon code]$ PATH=/home/zhujunhao/code:$PATH  

//可直接成功运行
[zhujunhao@bogon code]$ code.exe
Error:
    Please Inoput

        若我们真的执行了上面错误的替换指令,其实也不必担心。这里我们的修改环境变量的数据都是存入内存中的。当错误使用时,我们只需要重启系统即可恢复,系统会重新对环境变量初始化,恢复原有的数据。


        总:环境变量的好处很多在于它具有全局属性,可以被所有的子进程或孙子进程进行继承,而且也可在任意情况下使用,如PATH等,它们帮助系统、用户、应用程序和脚本进行配置和运行。

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

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

相关文章

【动画视频生成】

转自&#xff1a;机器之心 动画视频生成这几天火了&#xff0c;这次 NUS、字节的新框架不仅效果自然流畅&#xff0c;还在视频保真度方面比其他方法强了一大截。 最近&#xff0c;阿里研究团队构建了一种名为 Animate Anyone 的方法&#xff0c;只需要一张人物照片&#xff0…

数据结构与算法教程,数据结构C语言版教程!(第一部分、数据结构快速入门,数据结构基础详解)二

第一部分、数据结构快速入门&#xff0c;数据结构基础详解 数据结构基础&#xff0c;主要研究数据存储的方式。 本章作为数据结构的入门课程&#xff0c;主要让读者明白&#xff0c;数据结构到底是什么&#xff0c;常用的数据存储结构有哪些&#xff0c;数据结构和算法之间到底…

钉钉机器人接入定时器(钉钉API+XXL-JOB)

钉钉机器人接入定时器&#xff08;钉钉APIXXL-JOB&#xff09; 首先需要创建钉钉内部群 在群设置中找到机器人选项 选择“自定义”机器人 通过Webhook接入自定义服务 创建完成后会生成一个send URL和一个加签码 下面就是干货 代码部分了 DingDingUtil.sendMessageByText(webho…

【Python】ubuntu python>3.9编译安装,及多个Python版本并存的使用方法

【Python】ubuntu python3.9编译安装&#xff0c;及多个Python版本并存的使用方法 1. 安装依赖2. 编译与安装2.1 依赖与源获取2.2 配置2.3 编译2.4 安装2.5 链接动态库 3. 多版本兼容 1. 安装依赖 更新系统软件 在正式开始之前&#xff0c;建议首先检查系统软件是否均为最新&a…

构建高效数据中台:集群规划与搭建的最佳实践指南

架构设计 Rack(机架)配置建议 大数据集群规划 安装细节见配套文档 YARN资源管理平台队列调度策略 Capacity Scheduler 默认配置下,Capacity Scheduler 将尝试保证每个队列在其分配的容量内公平地使用资源。 然而,Hadoop 也支持通过调整队列的权重和使用抢占策略来优化资…

《Spring Cloud学习笔记:微服务保护Sentinel》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

微信小程序开发系列-04获取用户图像和昵称

这个功能的实现对于我这个新手来说可谓是一波三折。该功能的实现经历了三个“版本”的迭代&#xff0c;我的运气不是很好&#xff0c;从第一个“版本”开始尝试&#xff0c;这篇文章也是记录下这个过程&#xff0c;以便其他新手能快速找到解决方案。 Gen1-getUserInfo 第一个…

android studio导入module

在Android Studio中导入一个Module&#xff08;模块&#xff09;&#xff0c;可以按照以下步骤进行操作&#xff1a; 打开Android Studio&#xff0c;并打开你的项目。在菜单栏中&#xff0c;点击 "File"&#xff08;文件&#xff09;-> "New"&#xf…

音视频学习(二十二)——rtmp发流(tcp方式)

前言 本文主要介绍自研的RtmpStreamSender.dll&#xff0c;rtmp库提供接口接收裸流数据&#xff0c;支持将裸流数据封装为flv格式并通过rtmp协议发流。 关于rtmp协议基础介绍可查看&#xff1a;https://blog.csdn.net/www_dong/article/details/131026072 关于rtmp收流介绍可…

django的gunicorn的异步任务执行

gunicorn 本身是一个WSGI HTTP服务器&#xff0c;用于运行Python的web应用&#xff0c;如Django项目。它并不直接提供执行异步任务的功能。异步任务通常是指那些你想要在web请求之外执行的后台任务&#xff0c;如发送电子邮件、处理长时间运行的计算或与外部API交互等。 在Dja…

可视化云监控/安防监控系统EasyCVR视频管理平台播流失败的原因(端口篇)

安防视频监控EasyCVR平台兼容性强&#xff0c;可支持的接入协议众多&#xff0c;包括国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台能将接入的视频…

C++ list的模拟实现

一 定义节点类 list相当于带头节点的双向链表&#xff0c;我们定义节点时要用类模板参数&#xff0c;同时定义_next、_prev指针和数据_data&#xff0c;使用struct定义节点类&#xff0c;因为节点类要能够被访问&#xff0c;而struct的默认访问权限就是public&#xff08;当然手…

XIAO ESP32S3之物体检测加入视频流

一、前言 由于XIAO ESP32S3开发套件没有显示屏配件&#xff0c;因此加入http视频流功能&#xff0c;可通过浏览器请求ESP32S3上的视频流。 二、思路 1、XIAO ESP32S3启动后通过wifi连接到AP&#xff1b; 2、启动http服务器&#xff0c;注册get_mjpeg处理函数&#xff1b; 3…

GPT Zero 是什么?

from https://openaigptguide.com/gptzero/ 在人工智能技术飞速发展的今天&#xff0c;人们对于文字内容的准确性和可信度要求越来越高。例如在学术研究领域&#xff0c;防止抄袭和造假是非常重要的。而对于普通用户而言&#xff0c;辨别哪些内容是由人工智能生成的&#xff0…

ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

目录 ​专题一 开启大模型 专题二 基于ChatGPT大模型提问框架 专题三 基于ChatGPT大模型的数据清洗 专题四 基于ChatGPT大模型的统计分析 专题五 基于ChatGPT大模型的机器学习 专题六 基于ChatGPT大模型的科研绘图 专题七 基于ChatGPT大模型的GIS应用 专题八 基于基于C…

redis如何批量删除key

在redis-cli或者rdm可视化工具中删除 执行命令行&#xff1a;DEL keyword1:keyword2:Id:7316* 表示删除形如 keyword1:keyword2:Id:7316123222,keyword1:keyword2:Id:7316123223的key&#xff0c;在redis中存储的key一般是前面都相同的&#xff0c;后面为变量 lua脚本删除 如…

FTP原理与配置

FTP是用来传送文件的协议。使用FTP实现远程文件传输的同时&#xff0c;还可以保证数据传输的可靠性和高效性。 FTP的应用 FTP 提供了一种在服务器和客户机之间上传和下载文件的有效方式。在企业网络中部署一台FTP服务器&#xff0c;将网络设备配置为FTP客户端&#xff0c;则可…

在Java中,list集合拆分

在Java中&#xff0c;list集合中有1000行student类的数据&#xff0c;循环遍历如何优化拆分集合&#xff0c;效率变快&#xff0c;请详细的写出代码并把注释写上在Java中&#xff0c;可以使用多线程来优化循环遍历list集合的效率。以下是一个示例代码&#xff1a;java import j…

在Ubuntu20.04配置PX4环境

目录 1.下载PX4源码2.安装PX4所有工具链3.编译PX4工程1.下载PX4源码 打开Ubuntu,Ctrl+Alt+T打开终端输入下面代码: git clone https://github.com/PX4/PX4-Autopilot.git --recursive出现上图中出现“Command ‘git’ not found, but can be installed with”,使用以下代码…

蓝桥杯嵌入式KEY

1.按键原理图 2.按键GPIO引脚设置成输入&#xff0c;上拉模式 3.设置TIM4时钟源为外部时钟源 PSC为80-1 Period为10000-1 打开NVIC 中断时间为10ms 4.在bsp文件中添加interrupt.c文件 5.按键单击代码 6.长按键 7.按键过程和显示过程