Linux_环境变量_命令行参数

本文详细解释了Linux中的环境变量、PATH的作用以及如何查看和操作环境变量。还介绍了命令行参数argv的工作原理,强调了在编程中如何更方便地利用getenv和putenv获取和设置环境变量。
摘要由CSDN通过智能技术生成

一.环境变量

在Linux中自己写的程序必须要带路径才能运行,相对路径或是绝对路径,但是像ls pwd这样的程序,不带路径也能运行。
image.png
当你想要运行一个程序时:

  1. 如果带有路径的话,则直接将对应路径的程序加载进内存,变为进程,执行代码。
  2. 如果不带路径的话,则操作系统会去系统默认路径下搜索,没有找到则报错。

这个系统默认路径就是PATH环境变量,它里面存放了一些经常需要执行的命令路径,有了环境变量后,我们执行程序时,不用加路径,操作系统也能找到对应的位置。
像ls,touch这样的命令,它的路径已经存放在了对应的PATH环境变量里,我们自己写的程序的路径没有在PATH中,所以在查找时,找不到就报错了。只要将我们写的程序地址,加入到PATH环境变量里,就不会报错了。

1.1 概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
  • 环境变量本质上是shell进程内部的一张表,当启动shell时,从用户的配置文件读取信息,初始化环境变量表

image.png

  • 同时,在命令行中可以创建shell本地变量

image.png

1.2 查看环境变量

1.2.1 echo 查看某个环境变量

image.png

1.2.2 env 查看环境变量

image.png

  • PATH :系统默认搜索路径
  • LOGNAME:登录SHELL的用户
  • USER:当前正在使用的用户
1.2.3 set 查看本地变量和环境变量

image.png

1.2.4 unset 取消本地变量和环境变量

image.png

1.2.5 export 将本地变量导入环境变量表中

image.png

1.2.6 putenv
  • 防止putenv里面出现指针问题。防止指针内容改变导致环境变量一直变化

1.3 代码中使用环境变量

在bash上运行的程序都是bash的子进程,在创建子进程时,父进程将它的环境变量表传递到子进程中,所以子进程可以访问环境变量表,这也说明了环境变量表具有全局属性,但是bash中的本地变量不能传递给子进程,只能在bash内部使用。

  1. 使用main函数参数来获取

env是一个指针数组,是一个环境变量表,最后一个位置总是为NULL,所以结束的判断为env[i]

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

  1. 使用全局变量environ来获取
    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 
W>  5 int main()
    6 {
    7   extern char** environ;
    8 
    9   for (int i = 0; environ[i]; ++i)
   10   {
   11     printf("environ[%d], %s\n", i, environ[i]);                                                                                                                                                            
   12   }
   13   return 0;
   14 }
   15 

  1. 使用函数获取(推荐)

上述两种方法需要程序员自己遍历环境变量表来获取对应的环境变量,使用不方便,使用函数获取更为简单。
image.png

    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 
W>  5 int main()
    6 {
    7   char* path = getenv("PATH");
        // putenv 可以导入环境变量
    8   if (path != NULL)                                                                                                                                                                                        
    9   {
   10     printf("%s\n", path);
   11   }
   12   return 0;
   13 }
   14   

二.命令行参数

main参数一般有三个int main(int argc, char* argv[], char* env[])

  • argv:指针数组,类似于env环境变量表,存放的是一个个字符串,最后一个位置是NULL
  • argc:表示argv里面有几个字符串
    1 #include<stdio.h>
    2 #include<unistd.h>
    3 #include<stdlib.h>
    4 
W>  5 int main(int argc, char* argv[], char* env[])
    6 {
    7   int i = 0;                                                                                                                                                         
    8   for (; i < argc; ++i)
    9   {
   10     printf("argv[%d]->%s\n", i, argv[i]);
   11   }
   12   return 0;
   13 }
   14 

image.png
通过上述观察,可以很清晰的看出,argv表是由bash父进程制作(在命令行输入的),传递给子进程的。
第一个参数是可执行程序,之后的参数作为命令行选项。

  • ls -a -l 就是传递命令行参数,根据参数的不同,执行不同的代码逻辑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值