【Linux】详解环境变量与命名行参数

news2024/12/23 13:57:18

目录

  • 环境变量
    • 了解PATH
    • 什么是环境变量?
    • 使用环境变量
    • 系统自带环境变量示例
  • 命名行参数
    • argc与argv
    • env
    • environ

环境变量

了解PATH

提出问题:
在这里插入图片描述
在这里插入图片描述

 我写的可执行程序,与系统的可执行程序都是可执行程序,那么为什么执行系统的可执行程序不需要带 (./)就能直接运行,而我自己写的可执行程序需要带(./)才能运行。

 我想要我的可执行程序也像指令一样,不需要带(./)也能直接运行,前提是我们要先找到这个程序。
 (./Test)这个(./)代表的是当前路径,这样有路径才能找到程序。而系统的指令是由系统自己找的

添加为指令方法:

sudo cp (可执行文件) /usr/bin/

在这里插入图片描述
 我们只需要将可执行程序添加到系统路径中,这样就能直接使用了,但是这种方法不建议使用,因为你的指令没有经过测试,会污染指令池。

删掉可执行文件:
sudo rm /usr/bin/可执行文件

另一种方法:添加路径进入PATH环境变量中
 PATH : 指定命令的搜索路径

 查看环境变量方法:

echo $NAME //NAME:你的环境变量名称

在这里插入图片描述
 这些以每个冒号隔开的路径就是我们的指令搜索的路径,我们使用指令的时候会在这些路径里面一个一个取寻找,找到了就执行,没找到则报错。
在这里插入图片描述
 将路径导入到PATH环境变量里面:

export PATH=$PATH:(pwd:你所在的路径)

在这里插入图片描述
 现在我们执行不用带路径了。

你写的可执行程序不能直接像指令一样不带路径执行,是因为你写的可执行程序的路径不在系统的默认搜索路径下面,而系统的指令能够执行,是因为PATH环境变量本来就默认带了系统的指令路径

什么是环境变量?

 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
 Linux 中的环境变量是动态命名值,用于存储有关系统及其上运行的应用程序的信息。它们可用于自定义应用程序的行为、设置默认设置以及存储重要信息,例如用户的主目录或可执行文件的路径。
 环境变量通常在用户的 shell 启动文件中设置,例如 或 。它们也可以基于每个应用程序进行设置,也可以在文件中在系统范围内设置。

 设置环境变量后,它将可用于从当前 shell 启动的所有应用程序。您可以查看当前使用该命令设置的所有环境变量的列表。
 显示所有环境变量:

env

在这里插入图片描述

环境变量其实是为了满足操作系统不同场景预先在系统内设置的一大批的全局变量,这些变量在整个bash中都能一直访问到

环境变量是一种存储可由程序和脚本访问的数据的方法。它们通常用于存储密码、数据库连接字符串和其他敏感信息等内容。环境变量在操作系统中设置,然后可用于在同一台计算机上运行的所有程序。

环境变量可用于存储各种数据。环境变量的一些常见用途包括:

  • 存储密码:环境变量可用于存储应用程序和服务的密码。这可以通过防止密码以纯文本形式存储在计算机上来帮助确保密码安全。
  • 存储数据库连接字符串:环境变量可用于存储数据库连接字符串。这有助于确保数据库连接信息的安全,并简化数据库连接管理。
  • 存储其他敏感信息:环境变量可用于存储其他敏感信息,例如 API 密钥和 OAuth 令牌。这有助于确保此信息的安全,并更轻松地管理对应用程序和服务的访问。
  • 环境变量是一个强大的工具,可用于以安全的方式存储和访问数据。它们是开发人员和系统管理员的宝贵工具。

以下是使用环境变量的一些其他提示:

  • 对环境变量使用描述性名称。这将使您更容易理解变量的用途。
  • 对环境变量使用强密码。这将有助于确保您的数据安全。
  • 不要将敏感信息存储在公众可访问的环境变量中。例如,不要将密码存储在非管理员用户可访问的环境变量中。
  • 使用版本控制系统跟踪对环境变量的更改。这将有助于确保您不会意外删除或覆盖重要的环境变量。

使用环境变量

我们在代码里面,也能拿到环境变量:
在这里插入图片描述

 我们写入下面的程序:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #defile USER "USER"
  4 
  5 int main()
  6 {
  7     char* who = getenv(USER);
  8     printf("user:%s\n",who);                                                                                                                                                                                       
  9     return 0;                                                                                                               
 10 }  

 运行结果:
在这里插入图片描述

 环境变量USER信息:
在这里插入图片描述
 我们先将用户转换为root:
在这里插入图片描述
在这里插入图片描述

USER环境变量的最大意义,可以标识当前使用的Linux用户

 我们更改代码为下:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>                                                                                                                                                                                           
  4 #define USER "USER"
  5 
  6 int main()
  7 {
  8     char* who = getenv(USER);
  9     if(strcmp(who,"root")==0)
 10     {
 11         printf("user:%s\n",who);
 12         printf("user:%s\n",who);
 13     }
 14     else
 15     {
 16         printf("权限不足!!\n");
 17     }
 18     return 0;
 19 }

 运行结果:
在这里插入图片描述
 我们 su - 重新登陆为root时:
在这里插入图片描述
 使用sudo命令也可以执行:
在这里插入图片描述

我们在有时候使用某个命令发现是权限不足的时候,其实在底层也是差不多的。通过它的拥有者所属组权限判断,写指令的人会在指令内部进行判断你是否有权限使用。

我们还可以这样使用:
在这里插入图片描述
环境变量类似全局变量

 且看下面代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #define USER "USER"
  5 #define MY_ENV "myvalue"
  6 int main()
  7 {
  8     //char* who = getenv(USER);
  9     char* myenv = getenv(MY_ENV);
 10     if(myenv == NULL)
 11     {
 12         printf("%s:not found\n",MY_ENV);
 13         return 1;
 14     }
 15     printf("%s=%s\n",MY_ENV,myenv);
 16 	return 017 }

在这里插入图片描述
 代码结果:我们并没有发现我们定义在外面的myvalue,说明myvalue不是环境变量

设置一个新的环境变量:

	emport (名字)

在这里插入图片描述
 同时我们重新运行之前上面代码:
在这里插入图片描述
 我们还可以这样使用export:
在这里插入图片描述
 取消环境变量:
在这里插入图片描述

./Test

  • bash是一个系统进程,而我们写的Test也会变成一个子进程(fork),环境变量具有全局属性,原因是它会被子进程继承下去。
  • 为什么要继承下去?
    为了不同的应用场景:让bash帮我找指令路径,身份认证

myvalue=12345

  • 本地变量,只能在当前进程(bash)内有效

我们在使用指令的时候,比如ls 、cat等都不需要带路径,是因为有PWD这个环境变量在维护你所在的路径,你的路径变了,PWD维护的路径也会跟着变化,所以我们使用系统指令不需要额外添加绝对或相对路径,因为有PWD这个环境变量可以得知你所在的路径,直接使用即可
在这里插入图片描述

写一个pwd命令:

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4   
  5 #define MYPWD "PWD"
  6    
  7 int main()
  8 {                  
  9     printf("%s\n",getenv(MYPWD));                                                                                                                                                                             
 10     return 0;
 11 }

在这里插入图片描述

系统自带环境变量示例

环境变量是一个强大的工具,可用于自定义应用程序和系统的行为。通过了解环境变量的工作原理,您可以使您的 Linux 系统更高效、更用户友好。

环境变量相关的命令

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

环境变量的一些示例:

  • PATH:此变量存储搜索可执行文件的目录列表。
  • HOME:此变量存储当前用户的主目录。
  • SHELL:此变量存储当前用户 shell 的路径。
  • LANG:此变量存储当前语言和区域设置。
  • MAIL:此变量存储当前用户邮件的位置。

您可以使用环境变量执行以下操作:

  • 设置默认文本编辑器或浏览器。
  • 更改可执行文件的路径。
  • 设置系统区域设置和键盘布局。
  • 存储机密令牌或密码。

 在 Linux 中,环境变量可以影响应用程序的运行方式,例如,可以修改应用程序的输入和输出路径,控制程序的执行环境等。许多 Linux 发行版都会提供工具来帮助用户配置环境变量,例如:“export”命令和“set”命令等。

 对于普通用户而言,环境变量通常只对单个应用程序产生影响,例如:“JAVA_HOME”变量可以影响 Java 程序的执行环境。而对于系统管理员而言,他们可以配置环境变量以影响整个系统的行为,例如:“PATH”环境变量可以指定系统命令查找的路径。


命名行参数

argc与argv

且看下面代码分析:

//myproc.c
  1 #include <stdio.h>  
  2   
  3 int main(int argc, char* argv[])  
  4 {  
  5     for(int i=0;i<argc;i++)
  6     {
  7         printf("argv[%d]->%s\n",i,argv[i]);
  8     }
  9     return 0;
 10 }        

在这里插入图片描述
 上面程序执行,我们在命名行上输入的东西逐渐变多,这个数组打印的东西也变多
在这里插入图片描述
在这里插入图片描述
 所谓的命令行参数其实需要将程序名与选项依次传递给 argv 的
在这里插入图片描述

我们改进一下代码,跟别的指令(ls等)一样,通过输入不同的选项,运行不同的功能:

//myproc.c
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[], char* env[])
{
    if (argc != 2)
    {
        printf("Usage: \n\t%s [-a/-b/-c/-ab/-bc/-ac/-abc]\n", argv[0]);
        return 1;
    }
    if (strcmp("-a", argv[1]) == 0)
    {
        printf("功能a\n");
    }
    if (strcmp("-b", argv[1]) == 0)
    {
        printf("功能b\n");
    }
    if (strcmp("-c", argv[1]) == 0)
    {
        printf("功能c\n");
    }
    if (strcmp("-ab", argv[1]) == 0)
    {
        printf("功能ab\n");
    }
    if (strcmp("-bc", argv[1]) == 0)
    {
        printf("功能bc\n");
    }
    return 0;
}

 执行结果:
在这里插入图片描述

env

另外一个参数env:

    1 #include <stdio.h>
    2 #include <string.h>
    3 
    4 int main(int argc,char* argv[],char* env[])
    5 {
    6     for(int i=0;env[i];i++)//环境变量最后以NULL结尾
    7     {
    8         printf("env[%d]:%s\n",i,env[i]);
    9     }
   10     return 0;
   11 } 

 其实env就是一个指针数组,里面指向由环境变量形成的长字符串,这里的代码就是打印所有环境变量
在这里插入图片描述
 我们可以通过增加一个环境变量来验证一下:
在这里插入图片描述
 可以发现,我们增加一个环境变量,然后运行mypro程序,出现了这个环境变量。

environ

在这里插入图片描述
 我们在使用main函数的时候可以不传递参数,使用environ指针

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 //int main(int argc,char* argv[],char* env[])
  5 int main()
  6 {
  7     extern char** environ;
  8     for(int i=0;environ[i];i++)
  9     {
 10         //printf("env[%d]:%s\n",i,env[i]);
 11         printf("environ[%d]:%s\n",i,environ[i]);                                                                                                                                                              
 12     }
 13     return 0;
 14 }

 作用跟char * env[ ]是一样的
在这里插入图片描述
在这里插入图片描述

在进程上下文中,获取环境变量的三种方式:

  • getenv
  • char* env[ ]
  • extern char** environ

如有错误或者不清楚的地方欢迎私信或者评论指出🚀🚀

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

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

相关文章

Dokcer安装---Mqtt

1、拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6 老版本 2、运行 docker run -it --name emq -p 18083:18083 -p 1883:1883 -p 8084:8084 -p 8883:8883 -p 8083:8083 -d registry.cn-hangzhou.aliyuncs.com/synbop/emqttd:2.3.6 –name 容器…

佩戴舒适度极好的蓝牙耳机推荐,久戴不累的蓝牙耳机分享

​听歌、刷剧、游戏&#xff0c;运动、吃饭、睡觉等&#xff0c;要说现在年轻人除了离不开手机之外&#xff0c;还有就是蓝牙耳机了&#xff01;当然&#xff0c;随着蓝牙耳机的快速发展&#xff0c;各种各样的蓝牙耳机都有&#xff0c;导致很多人不知道耳机怎么选了&#xff0…

管理类联考——逻辑——知识篇——第五章 假言命题(必考)(最重要的基础)

第五章 假言命题&#xff08;必考&#xff09;&#xff08;最重要的基础&#xff09; 假言命题&#xff1a;陈述某一事物情况是另一件事物情况的条件的命题。假言命题中的充分条件假言命题和必要条件假言命题是联考逻辑最重要的必考考点。1 *本质为&#xff1a;充分必要&#…

Vue中如何进行分布式鉴权与认证

Vue中如何进行分布式鉴权与认证 随着前后端分离的趋势不断加强&#xff0c;前端应用的安全性问题也日益受到关注。在Vue应用中&#xff0c;我们通常需要实现分布式鉴权和认证&#xff0c;以确保用户的安全性和数据的保密性。本文将介绍在Vue中如何进行分布式鉴权与认证。 什么…

闲聊下最近哦

随便聊聊 聊聊最近工作或日常上一家公司一直比较忙,人也比较懒,一直没有写博客,最近换了下工作,争取坚持写博客吧 聊聊最近工作或日常 上一家公司一直比较忙,人也比较懒,一直没有写博客,最近换了下工作,争取坚持写博客吧 上家公司做了几年多了,上半年离职换了个工作,现阶段这…

《六》TypeScript 中的泛型

泛型&#xff1a;宽泛的类型&#xff0c;其实就是类型的参数化&#xff0c;让类型像参数一样&#xff0c;不预先指定&#xff0c;而是在使用的时候再让别人传入进来。 在定义函数、类或者接口时&#xff0c;如果遇到类型不明确的时候&#xff0c;就可以使用泛型。 平常开发中可…

Qt5.15.10+msvc2019_x86+qwebengine(含mp4)源码编译

系统要求: win10 64bit 英文版(或者把“区域”->“管理”->“非Unicode程序中所使用的当前语言”->改为"英语(美国)") 内存16g够用,cpu性能越高越好,硬盘在安装环境、下载源码后,至少还有100g可用空间 下载源码: https://download.qt.io/archiv…

Hive SQL:DDL建库 建表

Hive SQL:DDL建库 / 建表 &#x1f418;Hive SQL数据库 建库 数据库 在Hive中&#xff0c;默认的数据库叫做default&#xff0c;存储数据位置位于HDFS&#xff1a;/user/hive/warehouse 用户自己创建的数据库存储位 &#xff1a;/user/hive/warehouse/database_name.db 创…

linux文件的增量备份 Shell命令脚本

简单的增量备份脚本&#xff0c;自己用到了之后把部分择出来记录一下&#xff0c;方便日后查阅 # 昨天对应的月份 n_mon$(date -d -1day %Y%m) # 组合文件夹路径 path/home/admin/"$n_mon" # 昨天的0点作为增量备份起始时间&#xff0c;今日0点作为截止时间 s_date$…

web3带大家简单建立区块链概念

上文 Web3.0概念我们简单说了说 web3的概念 可能很多人还是会感觉 太概念了 然后 这一篇 我们再了解一下区块链 因为 web3.0的一个构建基础 就是 区块链 有了区块链 才衍生出了后面的很多东西 去中心化的身份 去中心化的应用 dapp 其实最终的目的 也是带着大家去构建起自己的 …

RK3588 MPP解码句柄泄露问题记录

1. 问题背景 最近在用瑞芯微3588开发板做一个视频处理的项目&#xff0c;前两天拷机发生了闪退&#xff0c;弹出的问题是“打开文件过多”&#xff0c;经过初步排查定位到是MPP硬解码部分出的问题。 我的MPP解码部分主要用来读取网络相机rtsp流&#xff0c;主要参考了一个git…

智能应急照明及疏散指示系统在实际项目中的应用和其实际意义 安科瑞 许敏

摘要&#xff1a;近年来&#xff0c;随着照明技术的迅速发展&#xff0c;高大而复杂的智能建筑日益增多&#xff0c;消防应急照明法规和标准不断健全和完善&#xff0c;消防应急灯具产品品种不断增多&#xff0c;性能不断改进&#xff0c;技术水平有很大提高&#xff0c;得到了…

这就是艺术,优雅的二维码生成器「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 平时如果没有需要一般那团黑乎乎的二维码&#xff0c;估计路过的人看见第一眼就不会再看第二眼。但是假若&#xff0c;它是个帅哥靓妹&#xff0c;估计就不同了&#xff0c;更别提像是艺术画一样&#xff0c;将编码图案融入到画里的二维码生…

CEETRON如何赋能航空航天领域打造WEB CAE后处理系统?

CAE&#xff08;计算机辅助工程&#xff09;在航空航天领域具有广泛的应用&#xff0c;它在航空航天器的设计、性能评估和安全分析等方面开发坚持重要的作用。 本文主要探讨Ceetron集合CAE在航空航天领域中的应用价值&#xff0c;以及对CAE在航空航天领域应用的更详细描述&…

【粉笔刷题】第二回

在JavaScript中下面选项&#xff0c;关于this描述正确的是&#xff08;&#xff09; A在使用new实例化对象时, this指向这个实例对象 B当对象调用函数或者方法时,this指向这个对象。 C在函数定义时,this指向全局变量 D在浏览器下的全局范围内&#xff0c;this指向全局对象this表…

Django高级扩展之中间件

中间件是Django请求&#xff0f;响应处理的钩子框架。它是一个轻量级的、低级的“插件”系统&#xff0c;用于全局改变Django的输入或输出。每个中间件组件负责实现一些特定的功能。例如&#xff0c;Django包含一个中间件组件AuthenticationMiddleware&#xff0c;它使用会话将…

光伏电池局部遮阴下三种不同的工况对比MATLAB仿真模型

光伏电池局部遮阴下三种不同的工况对比MATLAB仿真模型及程序资源-CSDN文库https://download.csdn.net/download/weixin_56691527/87910311 模型简介&#xff1a; 建议使用MATLAB21b及以上版本打开&#xff01; 光伏阵列表面被局部遮挡时会产生热斑效应。为了防止太阳电池因热…

如何在Microsoft Excel中使用TRUNC函数

Excel 中有多种删除小数点和缩短数值的方法。在本文中,我们将解释如何使用 TRUNC 函数,以及它与其他技术的不同之处。 TRUNC函数 什么是 TRUNC 功能如何使用 TRUNC 函数从日期时间戳中删除时间什么是 TRUNC 功能 TRUNC 函数将数字截断为指定的小数位数。使 TRUNC 不同于其他…

windows编译ffmpeg,并开启png的编解码器

废话不多说了&#xff0c;先上下载链接 ffmpeg官方网站&#xff1a;http://ffmpeg.org/download.html ffmpeg源码下载链接:https://ffmpeg.org/releases/ffmpeg-3.4.13.tar.gz 如果需要其他版本&#xff0c;修改版本号即可&#xff0c;适用于3.4全系列&#xff0c;如https:/…

Vue中如何进行网页截图与截屏?

Vue中如何进行网页截图与截屏&#xff1f; 在Web开发中&#xff0c;有时候需要对网页进行截图或截屏。Vue作为一个流行的JavaScript框架&#xff0c;提供了一些工具和库&#xff0c;可以方便地实现网页截图和截屏功能。本文将介绍如何在Vue中进行网页截图和截屏。 网页截图 网…