Linux学习记录——십일 环境变量


1、认识

在云服务器上写程序时,最终的执行需要./文件名,点表示当前目录,/是文件分隔符,之后就会打印程序,这是用户的操作;而系统则不必这样做,这是因为系统有环境变量的支持。环境变量中有个常见的PATH,查看环境变量用这个指令echo $。执行就会出现一个路径,也就是PATH的路径,我们写的程序由于不在这个路径里,自然也就无法自动执行,所以需要用户自己指定路径。而系统命令,比如ls,用which ls查看路径,发现它的路径可以在PATH的路径里找到,所有调用ls时不需要指定路径。

要在PATH里添加自己的路径的话,命令:export PATH=$PATH:路径。这样可以不改变原有路径而添加新路径。当然也可以用cp -rf 文件名 /usr/bin指令把路径拷贝过去,也可以在系统目录里查看到,文件名和/usr之间有空格。

实际上像这样把可执行程序拷贝到系统默认路径下就相当于Linux的软件安装。而卸载,rm /usr/bin/文件名 -rf,就是删除路径。

通过以上例子,可以这样理解环境变量:它是由系统维护的,在特殊场景的变量。环境变量可以帮助编译器编译用户写的代码。

常见的环境变量:

PATH:指定命令的搜索路径
HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL:当前Shell,它的值通常是/bin/bash。

想查看某一个环境变量的话, echo $环境变量名,查看系统环境变量的话,env即可。

很多系统展现出来的规定都是依靠环境变量去实现的。

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

2、通过代码获取环境变量

1、手动获取

int main(int argc, char* argv[], char* envvp[])
{
    //envp就是环境变量的指针数组,每一个指向一个字符串,最后一个指向字符串的指针的下一项会指向NULL
    for(int i = 0; envo[i]; i++)
    {
        printf("envp[%d]->%s\n", i, envp[i]);
    }
    return 0;              
}

通过这个程序打印出来的就是传递给当前进程的环境变量表。每个字符串就是环境变量字符串。

假如不传参,我们也可以拿到环境变量。environ是一个全局变量,char**类型,相当于char* []

int main()
{
    extern char** environ;
    //envp就是环境变量的指针数组,每一个指向一个字符串,最后一个指向字符串的指针的下一项会指向NULL
    for(int i = 0; envo[i]; i++)
    {
        printf("envp[%d]->%s\n", i, envp[i]);
    }
    return 0;              
}

2、函数获取

但环境变量不需要用户自己去遍历。使用特定的函数可以获取。getenv函数,可根据变量名获取变量。这个需要头文件<stdlib.h>。

int main()
{
    char* user = getenv("USER");
    if(user == NULL) perror("getenv");
    else printf("USER: %s\n", user);
    return 0;
}

把user换成pwd,pwd这个指令也就写好了,如果把当前目录放到根目录下,export PATH=$PATH:路径,那么pwd和自己写的pwd查看到的都只有一个/。

如果想让写的这个程序只有自己可以执行:

#define NAME "zyd"

int main()
{
    char* own = getenv("USER");
    if(strcmp(own, NAME) == 0)
    {   
        printf("程序正常执行");
    }
    else
    {
        printf("当前用户%s非本人, 不能运行\n", own);
    }
    return 0;
}

3、重新认识环境变量

环境变量本质上是一个内存级的一张表,这张表由用户在登陆系统的时候,会给特定用户形成属于自己的环境变量表。每一个环境变量都有自己的应用场景。每一个元素都是kv的。

我们手动改环境变量时,再次运用变量会被改变,而重启一下就恢复正常了。环境变量在没有存入数据的时候,它放在系统的配置文件。在根目录下,ls -al,看到.bash_profile和.bashrc,这两个文件就是shell脚本,里面存放配置文件。

环境变量是在哪里建立的?启动Xshell后,内存会开一个Xshell进程,这个进程会读取命令和命令行,并且加载进环境变量这个表;当我们export一行代码后,比如a=‘!!!’,系统就会把它读成一个字符串"a=‘!!!’",并且由表中空着的指针去指向这个字符串,再重新设定NULL,当然空间不够就扩容。而创建子进程后,作为父进程,环境变量就会被传到子进程里。环境变量是由bash整理的。

在程序文件里,可以写printf(“myenv: %s\n”, getenv(“a”)); 运行成功后,我们就可以看到自己搞的这个a变量。

改环境变量用export是因为这样才可以继承到子进程,如果不加export,也可以写成功,但这将会是shell的本地变量,只在shell内部有效,我们写一个程序文件去调用它无法调用,这样的解决办法就是export 变量名就可,因为它已经被建立了,这时候export就是把本地变量添加到表里了。用env |grep 变量名就可以查看到变量。

unset可以取消本地和环境变量。

之后的博客中还会深入一下环境变量。但这篇也基本全了。

结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值