linux系统的环境变量-搞清环境变量到底是什么

环境变量

  • 引例
  • 环境变量
    • 常见的环境变量
    • echo
    • export
    • env
    • unset
    • set
  • 通过代码获取环境变量
    • 使用第三个参数获取
    • 使用全局变量enviorn获取环境变量
    • 通过系统调用获取环境变量
  • 环境变量具有全局属性
  • main函数前两个参数的作用

引例

在linux系统中,我们使用ls命令,直接在命令行中输入ls。即可列出当前目录内容。我们可以在/usr/bin/目录下找到ls的可执行文件。如下图:

在这里插入图片描述

看一看下面这种情况:
在这里插入图片描述
为什么上面两个"不同"命令实现的功能一样呢?
原因就是环境变量搞的鬼!因为我们平常输入的ls本质上其实就是该目录下的可执行文件。我们输入ls时,命令行通过“环境变量里的路径”自动帮我们找到了该文件!

为了验证这种情况?我们查看以下当前的环境变量:

echo $PATH

在这里插入图片描述
可以看到当前环境变量里面有==/usr/bin/==该路径,我们输入ls时,自动会根据路径去找相关可执行文件。

环境变量

一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊的用途,并且通常具有全局属性。

常见的环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录
  • SHELL:当前Shell,通常是/bin/bash

echo

查看环境变量
echo $环境变量名

如下例子:

echo $PATH && echo $HOME
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin
/home/xty

export

修改环境变量
用法:export PATH=
相当于赋值操作,使用:分割开。

示例:

export PATH=$PATH:/home/xty/cplusplus/linux/1027
解释:将PATH修改为$PATH(原来的环境变量)+自己新设置的路径。(注意路径中不能有. 否则会当成当前路径)

在这里插入图片描述

而该路径下有一个可执行文件,即我们自己写的c语言文件。

在这里插入图片描述
以前我们需要如上面执行自己的文件,而现在我们不需要这样了。
见证奇迹的时刻!如下所示:
在这里插入图片描述
我们仅仅输入文件名即可运行该程序,这就是环境变量的作用!

env

显示所有环境变量

unset

删除变量或函数
unset [-选项] 名字
f:函数
v:变量
在这里插入图片描述

set

显示本地定义的shell变量和环境变量。

通过代码获取环境变量

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

第一个参数:代表传入命令行参数的个数。
第二个参数:存储着指向命令行参数的指针。大小为argv
第三个参数:储存着系统的环境变量。

使用第三个参数获取

    1 #include<stdio.h>2 3  //通过第三个参数获取环境变量。4 int main(int argc, char *argv[], char *env[])                                                                                                                         5 {6   printf("begin.............\n");7 8   int i;9   for(i = 0; env[i]; i++)10   {11     printf("env[%d]:%s\n",i,env[i]); // 打印环境变量12   }13 14   printf("end.................\n");15 16 17 18   return 0;19 }

使用全局变量enviorn获取环境变量

在这里插入图片描述
如上图,这些环境变量存在environ中,存的是指向环境变量的指针。
示例:使用全局变量也可以获得环境变量。

    1 #include<stdio.h>4 int main(int argc, char *argv[])                                                                                                                                      5 {6   printf("begin.............\n");7 8   extern char **environ;//声明全局变量9   int i = 0;10   for(; environ[i];i++)11   {12     printf("%s\n",environ[i]);13   }      

通过系统调用获取环境变量

系统调用函数
getenv(环境变量名称)

运行示例:

    1 #include<stdio.h>2 #include<stdlib.h>4 int main(int argc, char *argv[])5 {6 7   printf("%s\n",getenv("PATH"));8   printf("%s\n",getenv("HOME"));                                                                                                                                      9 	return 0;10 }//输出结果/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin
/home/xty

环境变量具有全局属性

  • 子进程可以继承父进程的父进程的环境变量。
    例子:为什么我们能通过char *env[],获取环境变量?
    因为我们写的test程序是由父进程(bash)创建的,那些环境变量都是父进程(bash)的,子进程给继承过来了,表面上我们什么都没传,实际上父进程给我们自动传过来了。

  • 环境变量具有全局属性。
    通过export设置的环境变量都具有全局属性。
    看一下代码:

    1 #include<stdio.h>2 #include<stdlib.h>4 int main(int argc, char *argv[])5 {6 7   printf("%s\n",getenv("XTYY")); //获取XTYY环境变量8 9   printf("\n");                                                                                                                                                       10 }

起初我没有设置XTYY环境变量,我们什么也没有得到。后来我通过export设置后,再次运行程序,发现获得了环境变量。因此可以证明环境变量具有全局属性。
在这里插入图片描述

main函数前两个参数的作用

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

第一个参数:代表传入命令行参数的个数。
第二个参数:存储着指向命令行参数的指针。大小为argv

有一段示例程序可以解释这些参数的作用,
示例一:

  1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 #include<unistd.h>5 6 7 8 int main(int argc, char *argv[])9 {10   if(argc != 2)11   {12     printf("Usage: %s 至少要有一个选项\n", argv[0]);13     return 1;14   }15 16   if(strcmp("-a", argv[1]) == 0)17   {18     printf("这是功能一\n");19   }20   else if(strcmp("-b", argv[1]) == 0)21   {22     printf("这是功能二");23   }24 25   return 0;                                                                                                                                                             26 }27 

在这里插入图片描述
通过上面的例子我们可以看出,执行程序后,命令行的选项,被存到了argv的数组中,从而实现不同功能的作用。

示例二:

  8 int main(int argc, char *argv[])9 {10   printf("argc = %d\n",argc);11 12   int i = 0;13   for(; i<argc; i++)14   {15     printf("%s ",argv[i]);16   }17   printf("\n");                                                                                                                                                         18 }

在这里插入图片描述

可以看出,argc代表着选项的数量;argv[0],代表命令;其余代表选项。

以上就是环境变量相关知识,后续还会继续补充,请期待。

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

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

相关文章

python 打印与去除不可见字符 \x00

# 此处不是真实的\x00 被 空格替换了 text "boot_1__normal/ " print(text.strip()"boot_1__normal/") # 打印不可见字符 print(repr(text))>>> False boot_1__normal/\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0…

Prometheus+Grafana

一、Prometheus 获取配置文件 docker run -d -p 9090:9090 --name prometheus prom/prometheusmkdir -p /app/prometheusdocker cp prometheus:/etc/prometheus/prometheus.yml /app/prometheus/prometheus.yml停止并删除旧的容器&#xff0c;重新启动 docker run -d --name…

一带一路10周年:爱创科技加速中国药企国际化征程

“源自中国&#xff0c;属于世界”。 共建“一带一路”倡议提出10周年来&#xff0c;中国与沿线国家经济深度融合&#xff0c;在共商共建共享的基本原则下&#xff0c;“一带一路”形成了国际合作的平台和机制&#xff0c;跨国经济合作已基本形成。 随着“一带一路”合作日益加…

阿里云Apsara云栖大会2023

文章目录 2023/10/312023/11/012023/11/02彩蛋1&#xff1a;神州十六号彩蛋2&#xff1a;emm… 计算&#xff0c;为了无法计算的价值。 2023/10/31 合规性评审 2023/11/01 暂未开始 2023/11/02 暂未开始 彩蛋1&#xff1a;神州十六号 彩蛋2&#xff1a;emm…

Mybatis—基础操作

mybatis入门后&#xff0c;继续学习mybatis基础操作。 目录 Mybatis基础操作准备工作删除操作日志输入预编译SQLSQL注入参数占位符 新增操作基本新增添加后返回主键 更新操作查询操作根据id查询数据封装条件查询条件查询 Mybatis基础操作 准备工作 根据下面页面原型及需求&am…

【Linux】安装与配置虚拟机及虚拟机服务器坏境配置与连接

目录 操作系统介绍 什么是操作系统 常见操作系统 UNIX操作系统 linux操作系统 mac操作系统 嵌入式操作系统 个人版本和服务器版本的区别 安装VMWare虚拟机 VMWare虚拟网卡 ​编辑 配置虚拟网络编辑器 ​编辑 安装配置Windows Server 2012 R2 安装Windows Server 2…

轻量级gif制作工具 GIFfun中文 for mac

GIFfun是一款GIF制作工具&#xff0c;可以帮助用户从照片和视频中创建GIF动画。该软件具有多种功能&#xff0c;例如GIF转视频、视频转GIF、照片转GIF、照片转视频、GIF转JPG、调整GIF大小、PDF转GIF、PDF转JPG、裁剪视频、GIF编辑等。 GIFfun还提供了专业版功能&#xff0c;如…

代数结构上的泛型算法

一&#xff0c;半群算法 //半群 class SemiGroup { public://枚举只去掉1个数&#xff08;v.size()>1&#xff09;&#xff0c;剩下的数做p累积运算的结果template<typename T, typename Tfunc>static vector<T> allExceptOne(vector<T>& v, Tfunc p…

ubuntu(18.04) 安装 blast 并在php中调用

1、下载 https://ftp.ncbi.nlm.nih.gov/blast/executables/blast/LATEST/2、解压&#xff0c;配置环境变量 tar zvxf ncbi-blast-2.14.1-x64-linux.tar.gz解压后改名为 blast 配置环境变量&#xff0c;可以不配置 使用的时候直接绝对路径使用&#xff08;本次使用绝对路径&am…

回溯法(2)--图着色问题和旅行商问题

目录 一、图着色问题 1、算法设计 2、代码 二、旅行商问题 1、概述问题 2、穷举法 3、回溯法 一、图着色问题 1、算法设计 图着色问题&#xff0c;给定图中各个区域的相邻关系&#xff0c;抽象成一个无向图G&#xff08;V,E&#xff09;&#xff0c;给定m种颜色&…

【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件

文章目录 1.ProgressBar2. ImageList3.ListView控件 1.ProgressBar 用于显示某个操作的进度。 属性&#xff1a; Value: 表示当前进度条的值&#xff0c;其范围由Min和Max决定。Step: 设置每次调用PerformStep()方法时增加的步长。MarqueeAnimationSpeed: 在Style设置为Marq…

【强化学习】13 —— Actor-Critic 算法

文章目录 REINFORCE 存在的问题Actor-CriticA2C&#xff1a; Advantageous Actor-Critic代码实践结果 参考 REINFORCE 存在的问题 基于片段式数据的任务 通常情况下&#xff0c;任务需要有终止状态&#xff0c;REINFORCE才能直接计算累计折扣奖励 低数据利用效率 实际中&#…