Linux:环境变量

1.概念介绍

概念

环境变量是操作系统里面用来指定操作系统运行环境里的一些参数

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 ⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。

环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性

引入,argc argv

main函数有参数吗?有的

cpp 复制代码
int main(int argc ,char*argv[]) 

argc有效元素的个数

argv记录命令行的指针数组,把命令行打散然后放到指针数组内

实际上命令行参数就是可以通过选项来实现不同的功能

如ls -a/-b/-c.....

bash会自动把命令行自动切分然后放进argv里面

实现代码

cpp 复制代码
if (argc != 2)
    {
        printf("usage: %s [-a|-b|-c]\n", argv[0]);
        return 1;
    }

    const char *arg = argv[1];

    if(strcmp(arg, "-a")==0)
        printf("这是功能1\n");
    else if(strcmp(arg, "-b")==0)
        printf("这是功能2\n");
    else if(strcmp(arg, "-c")==0)
        printf("这是功能3\n");
    else
        printf("usage: %s [-a|-b|-c]\n", argv[0]);

实现结果

2.通过例子来加以理解

2.1要执行一个程序,就必须先找到它

bash通过PATH来找环境变量

2.2系统中存在环境变量来帮助找到目标二进制文件。

一些基本知识

系统存在环境变量:PATH.->指定命令的搜索路径

查看所有环境变量指令:env

环境变量格式:名字=内容

具体操作:

echo $PATH(名字):用来获取对应环境名字的内容。

PATH:查找可执行程序的路径。

PATH = (某一路径),等于把该路径覆盖PATH路径。

如果覆盖了,关掉重新登陆,自动刷新。

正确方法:

PATH = $PATH:目标路径

如何理解环境变量?存储角度。

1.如何理解环境变量

举个例子,比如说"ls -a -b",登录,bash先根据系统配置文件生成环境变量表,后用户输入命令行参数,生成命令行变量表, 后拿ls在PATH里面找是否存在,存在,执行,不存在就找不到

然后根据"ls"命令在PATH查找对应的命令是否存在,存在的话就执行,不存在的话就报错

2.环境变量,最开始从哪来?

环境变量是系统中的配置文件来的。就是根据bashrc 和bash_profile。

登录是,bash自动创建,经过bashrc 和bash_profile。

bash读取配置文件,形成环境变量表,把一个一个环境变量填入表中,任何一个bash中右环境变量表和命令行参数表,两个都是字符串

3.认识更多的环境变量

HOME,表示当前用户的家目录

SHELL:/bin/bash

USER:当前登录的用户是谁

su - :重新登陆,更改user lognanme

lohname:表示登录的是谁。

HISTSIZE = 1000:记录最新的1000条指令

命令:history |,查看最新的1000条命令

HISTNAME:主机名

LS_COLOR:配色方案

PWD:当前工作路径

OLDPWD:上一条路径。

4.获取环境变量的方法

4.1操作

env :查看全部环境变量

echo $名字:查看对应环境变量名字的内容

export MYENV = 112223344:新增一组环境变量名字 = 内容关系

unset MYENV:取消环境变量
main参数最多有几个?三个

cpp 复制代码
int main(int argc,char*argv[ ] ,char*env[ ] )

env环境变量。

4.2代码

方法1:父进程bash,环境变量可以被子进程(孙子进程,等等)继承

->环境变量在系统中具有全局特性

方法2:getenv setenv(设置环境变量)

getenv:获取环境变量的内容。

以下是一个进行身份识别,只有我自己才可以运行,root也不行

方法3:environ(本身是一个指向环境变量表的指针,char** eniron,所以是双指针)

cpp 复制代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

extern char **environ;

/// main有参数吗?有
/// 最多可以有几个? 3个
/// 是父进程传递给我们的
int main(int argc, char *argv[])
{
    (void)argc;
    (void)argv;
    if(fork() == 0)
    {
       for(int i = 0; environ[i]; i++)
       {
           printf("environ[%d]-> %s\n", i, environ[i]);
       }
    }
    sleep(3);
}

5.理解环境变量的特性

5.1全局性

5.2补充两个概念

bash会记录本地变量和环境变量

a.本地变量

不会被子进程继承,指挥在bash内部被使用

i=10

echo $i

得出10

b.我们的环境变量是在哪呢?

在bash里面。
属于export 内建命令( built-In command)

不需要创建子进程,而是让bash自己亲自执行

bash自己调用,或者系统调用完成。

相关推荐
努力的小帅6 小时前
Linux_基础IO(Linux入门到精通)
linux·动态库·静态库·计算机组成原理·io操作
txzz88886 小时前
CentOS-Stream-10 系统安装之Firewalld防火墙配置
linux·运维·网络·计算机网络·centos·firewall-cmd·linux防火墙
Konwledging6 小时前
VMA-virtual memory areas
linux
无事好时节6 小时前
【Linux 进程详解】从 PCB 到 fork
linux
NZT-486 小时前
服务器访问github受限的解决办法
运维·服务器·github
kaoa0006 小时前
Linux入门攻坚——57、HAProxy
linux·运维·服务器
噜啦噜啦嘞好6 小时前
Linux——网络概念
linux·网络
欢喜躲在眉梢里6 小时前
基于 openFuyao 社区的无硬件 UB 开发实战指南
运维·数据库·人工智能·vscode·ai·开发工具·go开发
博语小屋6 小时前
简单线程池实现(单例模式)
linux·开发语言·c++·单例模式