目录
Linux中的环境变量
常见环境变量 PATH :
和环境变量相关的命令
通过系统调用获取或设置环境变量
getenv
putenv
新增环境变量
进程切换:
main函数参数
命令行参数
Linux中的环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
常见环境变量 PATH :
指定命令的搜索路径 HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) SHELL : 当前Shell,它的值通常是/bin/bash
which ls
/usr/bin/ls
zhangsan@ubuntu:~/practice-using-ubuntu/20240920$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2f15ad836be3339dec0e2e6a3c637e08e48aacbd, for GNU/Linux 3.2.0, stripped
echo $PATH(系统的默认(维护可执行程序)搜索路径)
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
只有在PATH下的程序才能被直接执行。
查看主机名和用户名
zhangsan@ubuntu:~$ echo $LOGNAME
zhangsan
zhangsan@ubuntu:~$ echo $HOSTNAME
ubuntu
和环境变量相关的命令
1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
export xxx
export VAL="xxx"
将本地变量设为环境变量
3. env: 显示所有环境变量
env | grep myval
过滤出指定的环境变量
4. unset: 清除环境变量-> 需要一定的时间
5. set: 显示本地定义的shell变量和环境变量
通过系统调用获取或设置环境变量
getenv
SYNOPSIS
#include <stdlib.h>
char *getenv(const char *name);
#include<stdio.h>
#include<stdlib.h>
#define USER "USER"
int main()
{
char* who=getenv(USER);
printf("user: %s\n",who);
return 0;
}
user环境变量最大的意义是,可以标识当前使用Linux的用户。
#define USER "USER"
#define MY_ENV "myval"
int main()
{
char* myenv=getenv(MY_ENV);
if(NULL==myenv)
{
printf("%s,not found\n",MY_ENV);
}
printf("%s=%s\n",MY_ENV,myenv);
//printf("user: %s\n",who);
return 0;
}
可以观察export myval 前后的效果。
环境变量本来是定义给bash的,但会被子进程继承下去。->为了适应不同的应用场景。‘’
本地变量只会在当前进程(bash)内有效。
环境变量中有空格时应加上" "
环境变量是在bash内维护的,环境变量变化时,Shell会自动调整PWD的值。
#define MYPWD "PWD"
printf("%s\n",getenv(MYPWD));
putenv
更改或添加环境变量。
新增环境变量
export PATH=$PATH:/xx/xx/xx/xx
进程切换:
进程切换指的是要进行进程上下文的保护,当进程在恢复运行的时候要进行上下文保护(保护的是寄存器里的数据而不是寄存器本身)。
在任何时刻,寄存器里的数据,只是属于当前进程,寄存器被所有进程共享,但是进程里的数据,是每个进程各自私有的上下文数据。
cd ~
cd $HOME
~最终会被解释为HOME环境变量。
main函数参数
命令行参数
int main(int argc,char** argv,char* env[])
argc:程序名+参数个数
argv:程序名+参数
argv数组通常以null结束。
env:中存环境变量,最后同样以NULL结尾。
printf("%s\n",getenv("PATH"));
SYNOPSIS
extern char **environ;
for(int i=0;__environ[i];++i)
printf("%d:%s\n",i,*(__environ+i));