• Linux :环境变量



    全文约 3036 字,预计阅读时长: 9分钟


    环境变量

    • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
    • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

    常见环境变量:

    • PATH : 指定命令的搜索路径
        • 程序、命令、指令、可执行程序都是一个概念。
    • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
    • SHELL : 当前Shell,它的值通常是/bin/bash。
    • 这些环境变量会在系统成功登录时,自动把配置文件的脚本跑一下。
    • 对不同的环境变量修改,可实现不同的作用;永久有效需要修改配置文件。

    查看环境变量方法

    • echo $NAME :NAME:环境变量名称

    测试环境变量PATH

    • 比如:当键入一条命令,显示找不到时:那么它是去哪里找的呢?
    $ lll
    -bash: lll: command not found
    
    • 1
    • 2
    • PATH 就承担着命令搜索的功能;搜索命令时,会在当前目录下找,. /代表的是绝对路径;绝对路径下没有,再去默认路径下搜索。
      • 此变量显示时用 :分割每条路径。
    • 将自己的程序不用加 . /,就能跑的两种方法:
      • 将自己的可执行程序添加到系统路径下。
      • 将自己的路径放如PATH 路径下。
    [saul@VM-12-7-centos tt727]$ ls
    makefile  t1  t1.c
    [saul@VM-12-7-centos tt727]$ echo $PATH
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/saul/.local/bin:/home/saul/bin
    [saul@VM-12-7-centos tt727]$ sudo cp t1  /usr/sbin   //第一种
    [saul@VM-12-7-centos tt727]$ PATH=$PATH:/home/saul/tt727  //第二种
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    和环境变量相关的命令

    • echo: 显示某个环境变量值
    • export: 设置一个新的环境变量
      • 先创建本地变量,再 export
    • env: 显示所有环境变量
    • unset: 清除自己设置的环境变量
    • set: 显示本地定义的shell变量和环境变量

    • 既然是变量,就可以被创建,赋值。
    • 可以通过命令行建立两种变量:本地变量和环境变量。
      • 本地变量:命令行下输入
    [saul@VM-12-7-centos tt727]$my_envvar="cmd define local var"
    [saul@VM-12-7-centos tt727]$echo $my_envvar
    
    • 1
    • 2
    • 本地变量只在bash命令行下有效。
      • 加上一句:export my_envvar;在进程内部就可以通过printf("%s\n",getenv("my_envvar"));使用变量。
      • bash是大部分程序的父进程,同时可以证明:环境变量通常具有全局属性,可以被子进程继承下去

    环境变量的组织方式

    • 每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串。
    • 指针数组,每个元素指向的是一个变量字符串;相当于是 K---V模型。
      在这里插入图片描述
    • 通过代码获取环境变量的方法:
    • 方法1:通过main函数参数获得:
    • 继承bash的环境变量,系统上维护一张指针数组,既然是数组,就可以传递给函数,既然可以传递给函数,就可以传递给main函数。
    • 运行就会实现在命令行下输入env的效果。
    #include 
    int main(int argc, char *argv[], char *env[])
    {
    	 int i = 0;
    	 for(; env[i]; i++){
    	 printf("%s\n", env[i]);
    	 }
     	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 方法2:C语言提供的方法
      • 创建main函数栈帧时,压栈进来的。
    #include 
    int main(int argc, char *argv[])
    {
    	 extern char **environ;
    	 int i = 0;
    	 for(; environ[i]; i++){
    	 printf("%s\n", environ[i]);
    	 }
    	 return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    方法三:通过系统调用getenv:常用getenv和putenv函数来访问或设置特定的环境变量。

    #include 
    #include 
    int main()
    {
     printf("%s\n", getenv("PATH"));
     return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    关于main函数的参数

    • 叫做命令行参数,目前的知识量在windows下几乎体验不到9.0
    • int main(int argc, char *argv[])
      • argc 代表:数组 argv的有效元素个数。
      • argv字符指针数组:每个元素指向的是,命令行下你输入的字符串…
      • 指针数组,默认最后一个元素是:NULL。
    [saul@VM-12-7-centos tt726]$vim t1.c
    int main(int argc,char* argv[])
    {
        for(int i=0;i<argc;i++)//for循环内部创建变量 需要支持c99标准
        {
           printf("argv[%d]:%s\n",i,argv[i]);
            
        }
        return 0;
    }
    [saul@VM-12-7-centos tt726]$ ./t1 arg arg1 arg2
    argv[0]:./t1
    argv[1]:arg
    argv[2]:arg1
    argv[3]:arg2
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • makefile 文件:
    [saul@VM-12-7-centos tt727]$ cat makefile
    t1:t1.c
    		gcc -o $@ $^ -std=c99
    .PHONY:clean
    clean:
    		rm t1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 正如使用的 ls -a -l 的命令一样,实现同一个程序,可以设计出不同的业务功能。

    再来一组感受一下 main函数 的命令行参数:

    [saul@VM-12-7-centos tt726]$ vim t1.c
    #include 
    #include 
    #include 
    void Usae(char* proc)
    {
          printf("Usage:%s -[a|s] x y\n",proc);  //该这么用
    }
    int main(int argc,char* argv[])
    {
        if(argc != 4)
        {
          Usae(argv[0]);//告诉使用者格式不对
          return 1;
        }
        int x= atoi(argv[2]);
        int y=atoi(argv[3]);
        if(strcmp(argv[1],"-a")==0)
        {
            printf("%d + %d = %d\n",x,y,x+y);
        }
        else if(strcmp(argv[1],"-s")==0)
        {
            printf("%d - %d = %d",x,y,x-y);
        }
        else{
            Usae(argv[0]);
        }
        return 0;
    }
    
    [saul@VM-12-7-centos tt726]$ ./t1
    Usage:./t1 -[a|s] x y  //使用方法不对...
    [saul@VM-12-7-centos tt726]$ ./t1 -a 24 30   //微型计算器...
    24 + 30 = 54
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    Shell的内建命令:

    • Linux 的内建命令是 shell 程序的一部分,Linux 系统加载运行时就被加载并驻留在系统内存里的,因此执行速度较快。
      • OS:这些命令你放我这里吧,用的时候就别费力了。…

    参考:

  • 相关阅读:
    智能化档案管理系统,利用超高频RFID技术提升档案管理效能
    linux进程管理
    redis的简单使用
    Java面向对象
    图04---最小生成树与实现
    把ipa文件上传到App Store教程步骤
    WordPress初学者入门教程-WordPress的安全
    Biotin-LC-Hydrazide|CAS:109276-34-8|生物素-LC-酰肼
    【C++】借助cout进行控制台文本输出的基本原理及复杂格式控制方法
    AIOPS 学习之路
  • 原文地址:https://blog.csdn.net/WTFamer/article/details/125981397