全文约 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:这些命令你放我这里吧,用的时候就别费力了。…