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自己调用,或者系统调用完成。

相关推荐
在角落发呆5 小时前
工具配置备份步骤:从手动备份到自动化方案
运维·windows·自动化
_upupup6 小时前
Linux的调试工具——gdb/cgdb
linux·服务器
百度一下吧6 小时前
Nginx 使用手册:从安装配置到实战部署
运维·nginx
JeJe同学6 小时前
Docker镜像导入、容器启动
linux·运维·docker
Jason_zhao_MR6 小时前
Linux与实时控制如何兼得
linux·嵌入式硬件·机器人·工业控制
回眸&啤酒鸭7 小时前
【回眸】自动化白盒测试落地实战指南
运维·自动化·log4j
闲云野鹤在人间7 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
一个风轻云淡8 小时前
GCC 和 GDB命令简单解读
java·linux·前端
H.莓飛8 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
资料库018 小时前
Linux 8个常见运维故障排查
java·linux·运维