目录
前言
Main参数—命令行参数
命令行解释器:bash
认识环境变量
环境变量的作用
环境变量命令行操作
代码获取环境变量的用法
环境变量表
环境变量的存放
前言
环境变量是一个系统预定义的全局参数,系统自己开辟空间,将它存在于所有的Shell中,具有继承性,可以存储有关shell会话和工作环境的信息。
Main参数—命令行参数
在认识环境变量的功能前,先学习一下命令行参数。在Linux中,在我们启动的非图形化界面时的命令行时,实际上就是bash(或shell)给我们输出的命令行字符串。
命令行解释器:bash
是一种与计算机系统交互的程序,允许用户通过输入命令的形式与操作系统或软件进行通信。用户通过键盘输入命令,命令行解释器会解析这些命令并将其传递给操作系统或应用程序。根据用户输入的指令,调用系统程序或脚本完成相应的操作。将执行结果或错误信息反馈给用户。平时使用的一些命令如ls,touch,其实都是向bash传递信息,bash去执行对应的操作,理解为帮你完成任务的一个媒介。
bash输入ls会得到相关信息,其实就是让bash调用了ls的程序。所以不难理解当向在调用ls时候你还传递了-a,-l,这样的参数,说明程序是支持你调用时候传递参数的。调用你自己的程序那么也就可以传参。程序里面基本都有一个main()函数,你通过bash来运行你的程序就是bash在调用程序里的main()函数,那么你输入的参数也由程序的main()函数来就接收,于是引入了int main(int argc,char *argv[],char *env[]),你传递参数也就相当于和你的程序在交互了;
int argc
表示命令行参数的个数。
char *argv[]
是一个数组,存储每个参数的字符串(如 argv[0] 是程序名(比如ls),argv[1] 是 -a,argv[2] 是 -l)。
char *env[]
是环境变量的数组,用于获取运行环境的信息。当你在运行程序时,程序的进程会获得父进程的环境变量,你可以用这个参数来获取
#include<stdio.h>#include<stdio.h>int main(int n, char* news[]){//以下效果一样for (int i = 0; news[i]; i++){printf("第%d条参数:%s",i+1,news[i]);}return 0;}
告诉系统你是谁
使用命令行参数的小测试(命令行计算器)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc,char *argv[])
{if(argc != 4){printf("Usage:\n\t%s -[add|sub|mul|div] x y\n\n", argv[0]);return 1;}int x = atoi(argv[2]);int y = atoi(argv[3]);if(strcmp("-add", argv[1]) == 0){printf("%d+%d=%d\n", x, y, x+y);}else if(strcmp("-sub", argv[1]) == 0){printf("%d-%d=%d\n", x, y, x-y);}else if(strcmp("-mul", argv[1]) == 0){printf("%d*%d=%d\n", x, y, x*y);}else{printf("unknown!\n");}for(int i = 0; argv[i]; i++){printf("argv[%d]: %s\n", i, argv[i]);}return 0;}
编译运行一下:
atoi:(c语言函数)需要包含<stdlib.h>头文件,当参数位置传入的为NULL指针时会报错,当参数位置传入的为空字符串时,返回值为0,如果有字母就只返回之前的数字,作用是字符串转整数
认识环境变量
首先,要说明,每当启动系统时,环境变量就已被系统开辟完毕。
环境变量不是只有一个,而是一堆,是系统内具有特殊用途的变量。如:PATH、PWD、USER、HOME等。
环境变量的作用
系统通过环境变量来认识用户
环境变量可以很好的帮助系统、用户、应用程序和脚本进行配置和运行。系统下的环境变量非常多,这里我们先认识下PATH、PWD、USER、HOME的功能。
PATH:它告诉shell或bash进程在哪里查找可执行文件。当你在命令行中输入一个命令时,shell会在PATH变量指定的目录中查找该命令的可执行文件。
PWD:存放这当前目录的绝对路径,对应的指令功能是pwd。
USER:它表示当前shell或bash登录的用户。当用户登录系统时,系统会设置USER环境变量为该用户的用户名。这个环境变量在系统运行时始终运转,即使我们在中间切换用户,USER环境变量的值仍然会保持为原来的用户名。
HOME:它表示当前用户的家目录的路径。当用户登录系统时,系统会设置HOME环境变量为该用户的家目录路径。跟USER一样,这个环境变量在系统运行时始终运转。
重点说明下PATH环境变量。
当我们使用指令时,系统都会展开 PATH 对应下的路径进行搜索相关指令,所以无论在什么路径下,系统相关的指令都可以使用。没有在此路径下的指令需根据具体路径来执行。
如果想自己的程序可以被直接执行,有以下的方法
1、拷贝自己的程序名字放到环境变量的默认路径里面,比如/usr/bin/,但是不太好,会污染命令池
2、把自己的路径放到环境变量里面,PATH=(自己的环境变量):$PATH不加:$PATH则会覆盖,如果不小心覆盖了 就重启恢复环境变量
环境变量命令行操作
env:使用env指令进行查看系统下的所有环境变量以及环境变量对应的数据。
echo ¥环境变量名:查看单个环境变量的数据
export:export 是一个内置命令,export命令用于创建环境变量,定义一个变量并使用 export 命令后,它将变成一个当前bash的一个环境变量,适用于当前 shell 会话中运行的所有程序。它仅对当前会话有效,关闭终端或重启系统后会消失。
Set:查本地变量和环境变量
unset 变量名: 清除环境变量
补充:
环境变量具有全局属性,环境变量会被所有的子进程继承,包括孙子进程,我们借助bash运行程序时,所有程序的进程都是bash进程的子进程,所有说环境变量是被继承的。前面说过,程序的进程会获得父进程的环境变量,也就是可以获得bash进程的环境变量,你可以用通过main的第三个参数来获取,如下面代码
#include <iostream>
using namespace std;
int main(int n, char *S1[], char *S2[])
{for (int i = 0; S2[i]; i++){cout << "S2[" << i << "]: " << S2[i] << endl;}return 0;
}
本地变量只在内部有效,不会被子进程继承,不是环境变量。
代码获取环境变量的用法
environ和getenv函数
getenv:
这个常用,getenv(“usr“)…:可以获取到所有用户名
下面使用getenv获取表中的指定名称的环境变量
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{char*s = getenv("PATH"); //访问PATH环境变量cout << s << endl;return 0;
}
**environ:获取环境变量
在Linux中,environ是一个全局的外部变量,其类型为char**,存储着系统的环境变量。除了使用主函数中的第三个参数外,我们也可使用environ函数直接访问系统的环境变量。
注意:这里在代码内部使用environ时,需要先定义environ。在系统下的libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。定义如下
extern char **environ;
·
补充:
环境变量表
环境变量表简称环境表,它是一个存储环境变量的数据结构,类似于一个数组,其中每个元素都是一个环境变量,而environ指针指向的就是存放环境变量的数据结构,而getevn指向表中指定名称的环境变量。
每个程序都会有一张环境表,环境表是一个字符指针数组
环境变量的存放
Linux系统下的环境变量天然都会被保存在磁盘的文件中。只有登入系统时,bash/shell进程才会存在,也就是说只有登入系统的时候,才会分配bash/shell程序,而环境变量就在bash/shell的上下文中。当开始登入系统时,所有的环境变量都是从磁盘中的某些脚本或配置文件中来的。因此,每当重启系统时,环境变量都会被更新。
通常,我们可以使用 set 指令显示本地定义的shell变量和环境变量,但要注意的是,本地定义的shell变量不能被子进程进行下去,它只在本地bash内部有效。
在Linux系统中,.bash_profile是一个Shell脚本文件,它被用于在用户登录时设置用户的环境变量和配置选项。它是bash或shell的配置文件之一,通常位于用户的家目(~/.bash_profile)
当用户登录时,bash_profile文件会被自动执行,允许用户设置环境变量等。通过编辑bash_profile文件,用户可以定制自己的shell会话环境,以便更方便地使用命令行工具和应用程序。每个用户都有自己的这个自动执行文件
代码演示:
首先,我们要进行配置环境变量
利用source执行配置文件,或者重启终端。
因为当系统启动时,环境变量就已执行,因此,配置完毕之后要重启用户才可被运行
因为当系统启动时,环境变量就已执行,因此,配置完毕之后要重启用户系统才可被运行
.bash_profile(可以加环境路径,重启后还有)
就是在启动后自动执行操作添加和删除环境变量,配置bash的环境变量由于继承相当于配置所有bash运行程序的环境变量