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

news2024/11/18 9:35:55

环境变量

  • 引例
  • 环境变量
    • 常见的环境变量
    • 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.coloradmin.cn/o/1155634.html

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

相关文章

Python 算法高级篇:深度优先搜索和广度优先搜索的高级应用

Python 算法高级篇&#xff1a;深度优先搜索和广度优先搜索的高级应用 引言 1. 深度优先搜索&#xff08; DFS &#xff09;回顾2. 广度优先搜索&#xff08; BFS &#xff09;回顾3. 拓扑排序4. 连通性检测5. 最短路径问题6. 案例分析&#xff1a;社交网络分析7. 总结 引言 深…

剑指 Offer || 084.全排列||

题目 给定一个可包含重复数字的整数集合 nums &#xff0c;按任意顺序 返回它所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1…

【蓝桥杯选拔赛真题07】C++小球自由落体 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++小球自由落体 一、题目要求 1、编程实现 2、输入输出 二、算法分析

PostgreSQL在云端:部署、管理和扩展你的数据库

随着云计算技术的迅猛发展&#xff0c;将数据库迁移到云端已经成为许多企业的首选。而在众多数据库管理系统中&#xff0c;PostgreSQL因其稳定性、灵活性和可扩展性而成为了不少企业的首选之一。 部署PostgreSQL在云端 将PostgreSQL部署在云端是一个相对简单的过程。云服务提供…

IMX6ULL——GPIO

本章目的&#xff1a;使用GPIO点亮一个LED灯 1.LED原理 &#xff08;1&#xff09;LED类型&#xff1a;插脚LED&#xff1b;贴片LED。 &#xff08;2&#xff09;LED点亮电路 法一&#xff1a; 法二&#xff1a; 我们本章使用法二&#xff0c;使用IMX6ULL的GPIO引脚输出高低电…

Java架构师软件架构的演化和维护

目录 1 导学2 软件架构演化和定义3 面向对象软件架构演化4 软件架构演化方式的分类5 软件架构演化原则6 软件架构演化评估方法7 大型网站架构演化8 软件架构维护想学习架构师构建流程请跳转:Java架构师系统架构设计 1 导学 2 软件架构演化和定义 软件架构的演化和维护就是对…

2023-2024-1高级语言程序设计第1次月考

7-1-1 计算摄氏温度 给定一个华氏温度F&#xff0c;本题要求编写程序&#xff0c;计算对应的摄氏温度C。计算公式&#xff1a;C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出一个华氏温度。 输出格式: 在一行中按照格式“Celsius C”输出对…

软考系统架构师案例分析知识点整理

系统规划&#xff1a;包括系统项目的提出预可行性分析&#xff1b;系统方案的制定、评价和改进&#xff1b;新旧系统的分析和比较&#xff1b;现有软件、硬件和数据资源的有效利用&#xff1b; 软件架构设计&#xff1a;XML技术&#xff1b;基于架构的软件开发过程&#xff1b;…

【算法通关村第一关】链表经典问题

1.两个链表第一个公共子节点 1.这是一道经典的链表问题&#xff1a;输入两条链表&#xff0c;找出他们的第一个公共节点。 使用集合的方法&#xff1a; public ListNode findFirstCommonNodeBySet(ListNode headA,ListNode headB){Set<ListNode> set new HashSet<&g…

Linux服务器部署带Cplex的Java项目

Linux版Cplex安装 Cplex安装包 Cplex 22.1.0 Linux安装包 安装步骤 找到安装包的路径 [roothecs-327697 ~]# cd /www/cplex [roothecs-327697 cplex]# ls cplex_studio2210.linux_x86_64.bin使用chmod 777赋予安装包读、写、执行权限&#xff0c;使用./执行安装 [roothec…

数字IC前端学习笔记:数字乘法器的优化设计(基4布斯编码华莱士树乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 使用基2布斯乘法器虽然能减少乘数中0的数量&#xff0c;但最终还是无法减少部分积的数量&#xff0c;因此一种更合理的编码方式产生了——基4布斯编码。它可以将部…

LeetCode刷题---简单组(六)

文章目录 &#x1f352;题目一 69. x 的平方根&#x1f352;解法一&#x1f352;解法二&#x1f352;题目二 70. 爬楼梯&#x1f352;解法一 &#x1f352;题目一 69. x 的平方根 &#x1f352;解法一 class Solution(object):def mySqrt(self, x):""":type x:…

皮肤渲染方法总结

一、皮肤次表面光照 HDRP用的延迟管线&#xff0c;镜面和散射分开进行计算 UE有透射开启和关闭的效果 &#xff08;一&#xff09;镜面反射 BRDF和Kelemen方法 &#xff08;二&#xff09;次表面散射与透射 1.散射&#xff1a;BRDF与BRSSDF&#xff08;从反射点附近的点进行…

基于springboot框架的房屋租赁租房系统

功能如图所示 摘要 房屋租赁租房系统是一个基于Spring Boot框架开发的全新房地产管理平台&#xff0c;它旨在简化租房流程&#xff0c;提供房东和租户之间的高效互动&#xff0c;以满足现代社会对房屋租赁的不断增长的需求。该系统充分利用了Spring Boot的强大特性&#xff0c;…

电源控制系统架构(PCSA)之电源管理软件

下图显示了电源管理软件栈的简化表示。该图说明了OS电源管理框架、具有直接从SCP请求操作功能的组件以及它们与SCP固件之间的关系。 一个重要的方面是&#xff0c;所有硬件电源管理操作都是由SCP代表这些请求者执行的。 这种OS电源管理(OSPM)的简化表示可以分为两部分&#xff…

[NSSRound#6 Team]check(Revenge)

文章目录 考点tarfile文件覆盖漏洞&#xff08;CVE-2007-4559&#xff09;PIN码计算 解题过程非预期解预期解 考点 tarfile文件覆盖漏洞&#xff08;CVE-2007-4559&#xff09; Python 中 tarfile 模块中的extract、extractFile和extractall 函数中的目录遍历漏洞 允许 用户协…

点云配准--对称式ICP

对称式ICP 写在前面的话 针对于局部平面不完美的情况&#xff0c;提出了一种对称式ICP目标函数&#xff0c;相较于传统的ICP方法&#xff0c;增大了收敛域&#xff0c;提高了收敛速度。论文理论说明不甚清楚&#xff0c;实验较少&#xff0c;但代码开源。 理论 对称目标函数…

【Simulink】飞轮储能系统的建模与MATLAB仿真(永磁同步电机作为飞轮驱动电机)

目录 ​1 主要内容 2 结果分析 3 程序链接 ​1 主要内容 该仿真为飞轮储能系统的建模&#xff0c;包括电网侧和电机侧两部分模型&#xff0c;仿真采用永磁同步电机作为飞轮驱动电机&#xff0c;通过矢量控制的方式对其发电和电动的工况进行控制&#xff0c;同时&#xff0c…

数据库访问跳板机

应用场景 在安全性要求高的网络环境&#xff0c;可能会出现数据库ip访问限制&#xff0c;导致数据库只有指定服务器才能访问&#xff0c;在特定业务场景我们可能会经常多人查询该数据库的表&#xff0c;为了解决这个问题&#xff0c;我写了一个小工具。 核心思想 解决方案实…

WindowsTerminal 配置标签页(快速使用PowerCli)

需求 避免每次都需要手动输入密码、手动填写信息才能访问vcenter。结合WindowsTerminal快速创建标签页&#xff0c;需要时一键开启Powercli。 解决 编写启动PowerCli的bat脚本 内容如下 echo off powershell -NoExit -ExecutionPolicy Bypass -Command "Connect-VISe…