linux系统的环境变量-搞清环境变量到底是什么

简介: 引例在linux系统中,我们使用ls命令,直接在命令行中输入ls。即可列出当前目录内容。我们可以在/usr/bin/目录下找到ls的可执行文件。如下图:

引例

在linux系统中,我们使用ls命令,直接在命令行中输入ls。即可列出当前目录内容。我们可以在/usr/bin/目录下找到ls的可执行文件。如下图:

1f2441b02bd94775a654866e33d74593.png

看一看下面这种情况:

30c7140ffbd749b48a4ab6053756ad24.png

为什么上面两个"不同"命令实现的功能一样呢?

原因就是环境变量搞的鬼!因为我们平常输入的ls本质上其实就是该目录下的可执行文件。我们输入ls时,命令行通过“环境变量里的路径”自动帮我们找到了该文件!

为了验证这种情况?我们查看以下当前的环境变量:

echo $PATH

9a977e0b095a44afb6cd82e428a15b02.png

可以看到当前环境变量里面有==/usr/bin/==该路径,我们输入ls时,自动会根据路径去找相关可执行文件。

环境变量

一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊的用途,并且通常具有全局属性。

常见的环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录
  • SHELL:当前Shell,通常是/bin/bash

echo

查看环境变量

echo $环境变量名

如下例子:

echo $PATH && echo $HOME
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin
/home/xty

export

修改环境变量

用法:export PATH=

相当于赋值操作,使用:分割开。

示例:

export PATH=$PATH:/home/xty/cplusplus/linux/1027
解释:将PATH修改为$PATH(原来的环境变量)+自己新设置的路径。(注意路径中不能有. 否则会当成当前路径)

5d4d25983681440b8cd1385fed095bde.png而该路径下有一个可执行文件,即我们自己写的c语言文件。

bdcc83000d6f476da3cd375d337b37b7.png

以前我们需要如上面执行自己的文件,而现在我们不需要这样了。

见证奇迹的时刻!如下所示:

e7340e4685394be2b151bd686558a894.png

我们仅仅输入文件名即可运行该程序,这就是环境变量的作用!

env

显示所有环境变量

unset

删除变量或函数

unset [-选项] 名字

f:函数

v:变量

fb6097549afc49b8ad01d734d1b1fdef.png

set

显示本地定义的shell变量和环境变量。

通过代码获取环境变量

 int main(int argv, char* argv[], char *env[])

第一个参数:代表传入命令行参数的个数。

第二个参数:存储着指向命令行参数的指针。大小为argv

第三个参数:储存着系统的环境变量。

使用第三个参数获取

    1 #include<stdio.h>
    2 
    3  //通过第三个参数获取环境变量。
    4 int main(int argc, char *argv[], char *env[])                                                                                                                         
    5 {
    6   printf("begin.............\n");
    7 
    8   int i;
    9   for(i = 0; env[i]; i++)
   10   {
   11     printf("env[%d]:%s\n",i,env[i]); // 打印环境变量
   12   }
   13 
   14   printf("end.................\n");
   15 
   16 
   17 
   18   return 0;
   19 }

使用全局变量enviorn获取环境变量

7e09f3633eea4f7ba3322c887d915625.png

如上图,这些环境变量存在environ中,存的是指向环境变量的指针。

示例:使用全局变量也可以获得环境变量。

    1 #include<stdio.h>
    4 int main(int argc, char *argv[])                                                                                                                                      
    5 {
    6   printf("begin.............\n");
    7 
    8   extern char **environ;//声明全局变量
    9   int i = 0;
   10   for(; environ[i];i++)
   11   {
   12     printf("%s\n",environ[i]);
   13   }      

通过系统调用获取环境变量

系统调用函数

getenv(环境变量名称)

运行示例:

    1 #include<stdio.h>
    2 #include<stdlib.h>
    4 int main(int argc, char *argv[])
    5 {
    6 
    7   printf("%s\n",getenv("PATH"));
    8   printf("%s\n",getenv("HOME"));                                                                                                                                      
    9   return 0;
   10 }
  //输出结果
  /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin
/home/xty

环境变量具有全局属性

  • 子进程可以继承父进程的父进程的环境变量。
    例子:为什么我们能通过char *env[],获取环境变量?
  • 因为我们写的test程序是由父进程(bash)创建的,那些环境变量都是父进程(bash)的,子进程给继承过来了,表面上我们什么都没传,实际上父进程给我们自动传过来了。
  • 环境变量具有全局属性。
    通过export设置的环境变量都具有全局属性。
    看一下代码:
    1 #include<stdio.h>
    2 #include<stdlib.h>
    4 int main(int argc, char *argv[])
    5 {
    6 
    7   printf("%s\n",getenv("XTYY")); //获取XTYY环境变量
    8 
    9   printf("\n");                                                                                                                                                       
   10 }

起初我没有设置XTYY环境变量,我们什么也没有得到。后来我通过export设置后,再次运行程序,发现获得了环境变量。因此可以证明环境变量具有全局属性。

6ee58e7c8419463aa5b017b6c3fdcc8c.png

main函数前两个参数的作用

 int main(int argv, char* argv[])

第一个参数:代表传入命令行参数的个数。

第二个参数:存储着指向命令行参数的指针。大小为argv

有一段示例程序可以解释这些参数的作用,

示例一:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<unistd.h>
  5 
  6 
  7 
  8 int main(int argc, char *argv[])
  9 {
 10   if(argc != 2)
 11   {
 12     printf("Usage: %s 至少要有一个选项\n", argv[0]);
 13     return 1;
 14   }
 15 
 16   if(strcmp("-a", argv[1]) == 0)
 17   {
 18     printf("这是功能一\n");
 19   }
 20   else if(strcmp("-b", argv[1]) == 0)
 21   {
 22     printf("这是功能二");
 23   }
 24 
 25   return 0;                                                                                                                                                             
 26 }
 27 


323b929459d646f295194cdc9c4a8d8d.png

通过上面的例子我们可以看出,执行程序后,命令行的选项,被存到了argv的数组中,从而实现不同功能的作用。

示例二:

  8 int main(int argc, char *argv[])
  9 {
 10   printf("argc = %d\n",argc);
 11 
 12   int i = 0;
 13   for(; i<argc; i++)
 14   {
 15     printf("%s ",argv[i]);
 16   }
 17   printf("\n");                                                                                                                                                         
 18 }

951d1eb762fc481ab6428b760602c822.png

可以看出,argc代表着选项的数量;argv[0],代表命令;其余代表选项。

以上就是环境变量相关知识,后续还会继续补充,请期待。


目录
相关文章
|
19天前
|
存储 缓存 监控
Linux缓存管理:如何安全地清理系统缓存
在Linux系统中,内存管理至关重要。本文详细介绍了如何安全地清理系统缓存,特别是通过使用`/proc/sys/vm/drop_caches`接口。内容包括清理缓存的原因、步骤、注意事项和最佳实践,帮助你在必要时优化系统性能。
151 78
|
23天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
55 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
2月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
160 48
|
19天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
84 13
|
2月前
|
Ubuntu Linux 网络安全
linux系统ubuntu中在命令行中打开图形界面的文件夹
在Ubuntu系统中,通过命令行打开图形界面的文件夹是一个高效且实用的操作。无论是使用Nautilus、Dolphin还是Thunar,都可以根据具体桌面环境选择合适的文件管理器。通过上述命令和方法,可以简化日常工作,提高效率。同时,解决权限问题和图形界面问题也能确保操作的顺利进行。掌握这些技巧,可以使Linux操作更加便捷和灵活。
51 3
|
19天前
|
Ubuntu Linux C++
Win10系统上直接使用linux子系统教程(仅需五步!超简单,快速上手)
本文介绍了如何在Windows 10上安装并使用Linux子系统。首先,通过应用商店安装Windows Terminal和Linux系统(如Ubuntu)。接着,在控制面板中启用“适用于Linux的Windows子系统”并重启电脑。最后,在Windows Terminal中选择安装的Linux系统即可开始使用。文中还提供了注意事项和进一步配置的链接。
40 0
|
2月前
|
Linux
在 Linux 系统中,`find` 命令
在 Linux 系统中,`find` 命令
40 1
|
2月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
168 1
|
2月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
30天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。