Linux :环境变量


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


环境变量

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

常见环境变量:

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

查看环境变量方法

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

测试环境变量PATH

  • 比如:当键入一条命令,显示找不到时:那么它是去哪里找的呢?
$ lll
-bash: lll: command not found
  • 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  //第二种

和环境变量相关的命令

  • 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
  • 本地变量只在bash命令行下有效。
    • 加上一句:export my_envvar;在进程内部就可以通过printf("%s\n",getenv("my_envvar"));使用变量。
    • bash是大部分程序的父进程,同时可以证明:环境变量通常具有全局属性,可以被子进程继承下去

环境变量的组织方式

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

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

#include <stdio.h>
#include <stdlib.h>
int main()
{
 printf("%s\n", getenv("PATH"));
 return 0;
}

关于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

  • makefile 文件:
[saul@VM-12-7-centos tt727]$ cat makefile
t1:t1.c
		gcc -o $@ $^ -std=c99
.PHONY:clean
clean:
		rm t1

  • 正如使用的 ls -a -l 的命令一样,实现同一个程序,可以设计出不同的业务功能。

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

[saul@VM-12-7-centos tt726]$ vim t1.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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


Shell的内建命令:

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

参考:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值