【Linux】深入理解进程(三)(环境变量)
环境变量指操作系统用来指定在操作系统运行环境的一些参数比如:我们在编写C/C++代码时,链接时,我们不知道动静态库链接在哪,但是还能够运行,里面就有环境变量帮助编译器查找🚩环境变量具有全局属性(可以被子进程继承)查看环境变量PATH:指令搜素路径🚩为什么我们自己的可执行程序必须要加 ./而有些程序直接输入就行 ls ll 这种因为这些程序已被放入系统搜素路径中,可以直接搜素到,而./翻译过来就
文章目录
环境变量
🚩概念
环境变量指操作系统用来指定在操作系统运行环境的一些参数
比如:我们在编写C/C++代码时,链接时,我们不知道动静态库链接在哪,但是还能够运行,里面就有环境变量帮助编译器查找
🚩环境变量具有全局属性(可以被子进程继承)
查看环境变量
echo $环境变量名
echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jib/.local/bin:/home/jib/bin
🚩PATH
PATH:指令搜素路径
🚩为什么我们自己的可执行程序必须要加 ./ 而有些程序直接输入就行 ls ll 这种
因为这些程序已被放入系统搜素路径中,可以直接搜素到,而./翻译过来就是找到当前路径
那么怎么将mycode加入指令搜索路径,
export PATH=$PATH:路径
export PATH=$PATH:/home/jib/1010/environment
HOME,USER
系统怎么知道进哪个路径,HOME
和环境变量相关的命令
- echo 显示一个环境变量
- export 设置一个环境变量
- env 显示全部环境变量
- unset 取消一个环境变量
- set: 显示本地定义的shell变量和环境变量
环境变量组织形式

🚩命令行参数
main函数也是有参数的,只不过我们用的时候操作系统调用Startup(),CRTStartup()函数为我们搭建了C/C++环境,
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
using namespace std;
int main(int argc,char* argv[])
{
for(int i=0;i<argc;i++)
{
printf("argv[%d]-> %s \n",i,argv[i]);
}
//printf("%s ",getenv("MYVAL"));
if(argc >= 2)
{
if(strcmp(argv[1],"help")==0)
{
printf("帮助\n");
}
if(strcmp(argv[1],"-a")==0)
{
printf("功能a\n");
}
}
printf("");
return 0;
}
命令行输入的字符串进入**argv,
也可以像ls -a,ls -l这样

获取环境变量
命令行第三个参数
main还有第三个参数,环境变量表
打印
int main(int argc,char* argv[],char* env[])
{
for(int i=0;i<argc;i++)
{
printf("argv[%d]-> %s \n",i,argv[i]);
}
for(int i=0;env[i];i++)
{
printf("env[%d]->%s",i,env[i]);
}
//printf("%s ",getenv("MYVAL"));
if(argc >= 2)
{
if(strcmp(argv[1],"help")==0)
{
printf("帮助\n");
}
if(strcmp(argv[1],"-a")==0)
{
printf("功能a\n");
}
}
printf("");
return 0;
}

第三方变量environ
extern char** environ;
for(int i=0;environ[i];i++)
{
printf("environ[%d]->%s",i,environ[i]);
}
environ这个全局变量是C在运行库定义的,不是在程序中定义的
extern作用:这个environ不是在文件中定义的,链接的时候会找到它,
🚩系统调用或设置环境变量
getenv获取一个环境变量
printf(“%s\n”,getenv(“PATH”));
printf("%s\n ",getenv(“MYVAL”));

export设置环境变量
export MYVAL=“hello”

🚩环境变量被子进程继承了
我们运行的进程都是子进程,bash运行时,操作系统会从配置文件中找到环境变量,子进程继承父进程环境变量
若是没有export呢?

打印没打出来,但是echo又能找到
🚩内建命令常规命令
运行的进程都是子进程吗?也有例外
因为echo根本就没有创建子进程!
export影响shell所有子孙后代,没有export,./mycode创建子进程就继承不了MYVAL
没有export说明只是在该进程设置了环境变量,echo也没有创建子进程,在该进程中找到了MYVAL
两批命令:
- 常规命令(外部命令):通过创建子进程实现,大部分指令都是常规命令,ls,vim,grep
- 内建命令:bash不创建子进程,通过自己实现,bash调用了自己的写的或系统提供的函数,如pwd echo
内建命令作用?
有些指令必须要内建命令实现,常规命令创建子进程不影响父进程,cd指令我们要影响shell本身,如果是常规命令,创建子进程然后退出,目录就会没变,所以cd必须是内建命令
更多推荐


所有评论(0)