一、命令行参数是干什么的?
命令行参数能够实现指令级别的命令行选项的设置。
argv命令行参数表
int main(int argc, char* argv[]) //argc为字符串数量,argv为字符指针数组,必须以NULL结尾
{
return 0;
}
二、环境变量
1.为什么执行ls,pwd这样的程序不需要加./,而执行我们自己的程序要在前面加./呢?
要执行一个可执行程序,首先要找到它。执行shell自带的指令时,会有一个默认搜索路径,称为环境变量PATH,在这里可以找到指令。
echo $PATH //查看环境变量PATH
方法一:所以如果我们把自己的可执行程序路径也加入到PATH中,也就不用加./了。
PATH=/... //这样不行,会直接覆盖原有的PATH
PATH=$PATH:/... //这样是添加到原有的后面,以':'作为分隔符
若要删除,直接复制去掉要删除路径的PATH给当前PATH就可以。
我们修改的环境变量是在内存中的,重新登录xshell主机就会恢复
方法二:把可执行程序拷贝到PATH环境变量的列表当中。
sudo cp a.out /usr/bin //这个过程称为程序安装
2.pwd为什么知道我们当前所处的路径呢?
存在环境变量PWD,专门记录当前所处的路径,pwd读取PWD的内容就可以了。
3.分别以普通用户和root用户登录时,初始路径为什么不同?
4.env指令可以获取系统支持的所有环境变量
系统中会存在大量的环境变量,每一个环境变量都有它自己的特殊用途,用来完成特定的系统功能
5.可以通过代码系统调用getenv来获取环境变量
printf("PATH: %s\n", getenv("PATH"));
6.main函数可以不带参,可以带两个参数,也可以带三个参数,通过env环境变量表获取环境变量
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main(int argc, char *argv[], char *env[]) //环境变量表
{
int i = 0;
for(; env[i]; i++)
{
printf("pid:%d %s\n", getpid(), env[i]);
}
return 0;
}
运行输出:
与env指令得到的结果基本一致。
直接添加的环境变量是本地变量
7.环境变量从父进程传递到子进程不一定通过传参,也可以通过全局变量获取环境变量
C语言中存在一个全局变量声明environ,会自动指向环境变量表。
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
extern char **environ;
int i = 0;
for(; environ[i]; i++)
{
printf("pid:%d %s\n", getpid(), environ[i]);
}
return 0;
}
也能输出环境变量
8.系统环境变量具有全局属性
1.本地变量和环境变量的区别?
本地变量只在bash进程内部有效,不会被子进程继承下去。
环境变量通过让所有子进程继承的方式,实现自身的全局性。
2.echo也是子进程,为什么echo能打印本地变量的值呢?
当我们把PATH环境变量置空
ll、top、mkdir等指令就无法使用了,但为什么echo指令还能正常使用呢?
实际上,在Linux中大部分的命令是在磁盘当中真正存在的,需要fork创建子进程来执行命令,但还有一种命令,不需要子进程,有bash自己进行执行,这种命令等同于bash内部的一个函数,这种命令我们称之为内建命令。
Linux命令分类:
(1)常规命令,shell fork让子进程执行。
(2)内建命令,shell命令行的一个函数,自然可以直接读取shell本地变量了。
export命令也是内建命令,因为export不能创建子进程,如果创建子进程会导致把环境变量导入到子进程的环境变量中。
unset ENV_TEST3 //取消环境变量
set //查看包含环境变量在内的本地变量