Linux中的环境变量

这篇具有很好参考价值的文章主要介绍了Linux中的环境变量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.基本概念  

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
     

二. 环境变量分类

1.按生命周期分类

  • 永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
  • 临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。

2.按作用域分类

  • 系统环境变量:公共的,对全部的用户都生效。
  • 用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

三. 环境变量相关命令

1.env

env:查看当前用户全部的环境变量
linux环境变量,Linux,linux,运维,服务器

2.env|grep 环境变量名

env|grep 环境变量名:筛选包含的环境变量。
linux环境变量,Linux,linux,运维,服务器

3.export

export:显示当前系统定义的所有环境变量。
linux环境变量,Linux,linux,运维,服务器linux环境变量,Linux,linux,运维,服务器 

4.printenv 环境变量名

printenv 环境变量名:查看指定环境变量的值。
linux环境变量,Linux,linux,运维,服务器

5.unset 环境变量名

unset 环境变量名:清除指定环境变量。

linux环境变量,Linux,linux,运维,服务器

四. 常用环境变量

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。

​ PATH缺省包含Linux系统命令所在目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。

  PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>

  你可以自己加上指定的路径,中间用冒号隔开。环境变量更改后,在用户下次登陆时生效。

  如果想立刻生效,则可执行下面的语句:

  $source .bash_profile

  需要注意的是,最好不要把当前路径”./”放到PATH里,这样可能会受到意想不到的攻击。

  完成后,可以通过$ echo $PATH查看当前的搜索路径。这样定制后,就可以避免频繁的启动位于shell搜索的路径之外的程序了。

 设置变量的三种方法
1、在/etc/profile文件中添加变量【对所有用户生效(永久的)】

用vim在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。 例如:编辑/etc/profile文件,添加CLASSPATH变量

# vim /etc/profile

  export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

  注:修改文件后要想马上生效还要运行# source /etc/profile不然只能在下次重进此用户时生效。

2、在用户目录下的.bash_profile文件中增加变量【对单一用户生效(永久的)】

用vim在用户目录下的.bash_profile文件中增加变量,改变量仅会对当前用户有效,并且是“永久的”。 例如:编辑abc用户目录(/home/abc)下的.bash_profile

$ vim /home/abc/.bash.profile

  添加如下内容:

  export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

  注:修改文件后要想马上生效还要运行$ source /home/abc/.bash_profile
  不然只能在下次重进此用户时生效。

3、直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】

  在shell的命令行下直接使用[export 变量名=变量值]

  定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,
  shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,
  需要使用的话还需要重新定义。

linux环境变量,Linux,linux,运维,服务器

 五.main函数的参数个数

#include <stdio.h>  
#include <unistd.h>  
   
int main(int argc, char *argv[])  
{  
    //char *argv[]: 什么类型?里面放什么?  
    for(int i = 0; i < argc; i++)  
    {  
        printf("argv[%d]: %s\n", i, argv[i]);  
        return 0;                                                                                                               
    }                                                                                                                      
}      

linux环境变量,Linux,linux,运维,服务器

  •  我们平时在使用指令的时候会添加很多的选项比如说ls指令,单独使用ls指令会将当前路径下的每个可见文件的文件名全部显示出来并且一行显示多个文件名
  • 如果给ls指令添加-a选项就可以显示隐藏文件的文件名并且也是一行显示多个
  • 如果给ls指令添加-l选项那么可以显示当前路径下的所有可见文件的详细信息,并且一行显示一个
  • ls -l指令还可以简化成为ll并且功能还是一样的
  • 有些选项还可以结合在一起使用比如说-a选项是显示所有文件,-l选项是显示可见文件的详细信息,那-al选项就是显示所有文件的详细信息

那么上述功能的原理就和整型变量argc数组argv有关,argv数组中存储着输入的指令和选项,那么根据数组中的内容和else if语句就可以实现不同的选项执行不同的功能,比如说下面的代码:
 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char*argv[])
{
    if(argc>=3)
    {
        printf("指令使用错误最多支持一个选项\n");
 		return 0;
    }
    if(argc==1)
    {
         printf("开始执行功能一\n");
     }
     else 
     {
         if(strcmp(argv[1],"-a")==0)
         {
             printf("开始执行功能二\n");
             //对应的功能
         }
         else if(strcmp(argv[1],"-b")==0)
         {
             printf("开始执行功能三\n");
             //对应的功能
         }
         else if(strcmp(argv[1],"-c")==0)
         {
             printf("开始执行功能四\n");
             //对应的功能                                                                                                            
         }
 		 else if(strcmp(argv[1],"-d")==0)
         {
             printf("开始执行功能五\n");
             //对应的功能
         }
         else if(strcmp(argv[1],"-ab")==0)
         {
             printf("开始执行功能六\n");
             //对应的功能
         }
         else if(strcmp(argv[1],"-ac")==0)
         {                                                                                                                           
            printf("开始执行功能七\n");
            //对应的功能
         }
         else if(strcmp(argv[1],"-ad")==0)
         {
             printf("开始执行功能八\n");
             //对应的功能
         }
         else
         {
             printf("选项输入有误\n");
			return 0;
         }
    }
    return 0;
}

我们可以测试一下上面的代码,当一个选项都不带的时候就应该执行功能一:
添加-a选项的话就应该执行功能二
添加-ab选项的话就应该执行功能六
如果添加的选项过多或者选项不存在的话就会告诉使用者选项有误
linux环境变量,Linux,linux,运维,服务器
那么这就是main函数中的前两个参数的使用场景,有了这两个参数我们写的程序就可以根据不同的执行指令来执行不同的功能,指令的设计就是使用这种方式,在函数中对输入指令进行判断,再执行对应指令。无非就是使用C语言对具体功能进行封装。

第三个参数 

int main(int argc, char *argv[], char *env[])
{ 
	return 0;
}

通过代码如何获取环境变量

  • 命令行第三个参数
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main(int argc, char *argv[], char *env[])
    {
         int i = 0;
         while (env[i])
         {
              printf("%s\n", env[i]);
              ++i;
         }
         return 0;
    }
    

    编译运行:
    linux环境变量,Linux,linux,运维,服务器

    通过数组env也可以在程序内部打印出来环境变量的内容,但是main函数为什么要加第三个参数呢?getenv函数同样可以来获取环境变量的内容,如果想要获取某一个环境变量的内容的话应该使用getenv函数,而env数组是给子进程使用的子进程是一个笼统的概念,我们可能会在子进程中使用各种各样的功能,所以环境变量的每个值可能都要得到,所以就会有这个数组方便子进程使用环境变量,我们之前说环境变量具有全局属性在任意的进程中都能使用,它之所以有全局属性的原因是在创建子进程的时候会继承环境变量,那子进程是如何继承环境变量的呢?答案就是通过main函数的第三个参数来实现继承环境变量。我们把env数组看成一个表,表中的每个元素看成一个指针,指针指向的内容就是一个个的环境变量,linux还提供给我们一个二级指针,这个指针就指向的是表中的首元素
    linux环境变量,Linux,linux,运维,服务器
    每 个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

  • 通过第三方变量environ获取

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

    linux环境变量,Linux,linux,运维,服务器

     子进程在继承父进程的环境变量的时候是通过main函数的第三个参数实现的,而第三个参数是一个字符指针数组,数组在传参的时候传的是首元素的地址,所以子进程在继承环境变量的时候,系统得传一个二级指针那么这个指针就是上面使用的char**environ。

六.本地变量和全局变量的区别

先创建一段本地变量:
linux环境变量,Linux,linux,运维,服务器

对本地变量进行查找

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char* val=getenv("myval");
    if(val==NULL)
    {
        printf("not find myval\n");
    }
    else 
    {
        printf("%s\n",val);
    }
    return 0;
}

 linux环境变量,Linux,linux,运维,服务器

可以发现这个程序是找不到本地变量的。
那我们使用export修改一下本地变量myval为全局变量

linux环境变量,Linux,linux,运维,服务器
可执行程序便能找到myval这个全局变量了。

1、为什么该程序只能找到全局变量却找不到本地变量?

bash是一个系统进程,myproc会通过fork()变成bash的子进程。环境变量具有全局属性,可以被子进程继承。我们可以通过这些全局变量找指令路径,进行身份认证等。而本地变量仅当前进程(bash)有效,它的子进程无效。

2、为什么执行指令时默认是当前路径

因为有一个PWD的环境变量,它维护着用户当前所处的绝对路径,当用户所处的路径变化时,PWD环境变量会自动更新,我们在执行的指令,这些指令本质上是bash的子进程,它们可以拿到这个全局变量,这些指令也就知道了目前所处的绝对路径。

3.通过环境变量限制用户权限

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    char* name=getenv("USER");//通过"USER"环境变量可以对不同角色进行权限的限制。
    if(strcmp(name,"root")==0)
    {
         printf("%s\n",name);
    }
    else 
    {
        printf("权限不足\n");
    }
    return 0;
}

linux环境变量,Linux,linux,运维,服务器

 文章来源地址https://www.toymoban.com/news/detail-718310.html

到了这里,关于Linux中的环境变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

    【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

    本文思维导图概述的主要内容: 1.1 什么是 crontab Crontab 是一个在 Unix 和 Linux 操作系统上 用于定时执行任务 的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab 是 cron table 的缩写, cron 指的是 Unix 系统中的一个后台进程,它

    2024年02月08日
    浏览(68)
  • 【Linux运维】shell脚本检查服务器内存和CPU利用率

    在管理服务器时候写了一个 shell脚本,在服务上实现每天凌晨3点查系统的指定文件夹下的容量大小,如果超过10G就要删除3天前的内容,还要时刻查询内存和cpu利用率,如果超过80%就要提示用户出现过载 将以上代码保存为一个.sh文件,然后通过crontab在每天凌晨3点运行即可:

    2024年02月09日
    浏览(17)
  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(55)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(53)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(34)
  • 【Linux环境搭建】用云服务器搭建Linux环境

    【Linux环境搭建】用云服务器搭建Linux环境

    目录 1. 我们为什么要学Linux 2. 云服务器购买 3. 远程连接云服务器 4. 如何创建新用户   5. 第一个Linux程序 总结: 写在最后: 作为一个程序员,你必须学好Linux,至于为什么,这个问题, 在我们日后的学习中,自然会慢慢展现出来,而校招对于Linux也有掌握的要求, 所以我们

    2024年02月03日
    浏览(47)
  • 【Linux】云服务器搭建Linux环境

    【Linux】云服务器搭建Linux环境

    目录 🍊一.环境选择🍊 🍎二.购买云服务器🍎 🍏三.使用XShell远程登录云服务器🍏 1.下载XShell 2.进入授权界面,填写姓名和邮件,选择只需Xshell   3.填写信息后,会将下载链接发到邮件,点击链接下载安装即可 4.进入XShell ,使用命令行方式远程登录云服务器          

    2024年02月04日
    浏览(46)
  • 【Linux】主机搭建 Linux服务器环境 笔记

    【Linux】主机搭建 Linux服务器环境 笔记

    过年买了个 mini 主机当玩具玩一下,这里记录下。 已有主力机 (windows) 的情况下,使用过如下四种 Linux宿主环境。这里总结下区别。 优点 云服务器 虚拟机 笔记本电脑 mini主机 价格低 √ √ 便携 √ √ 环境隔离 √ √ √ 详细过程不贴出来了,把关键点回忆一下,方便以后快

    2024年02月21日
    浏览(50)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(33)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包