介绍
环境变量是一个系统预定义的全局参数,系统自己开辟空间,将它存在于所有的Shell中,具有继承性,可以存储有关shell会话和工作环境的信息。
环境变量不是只有一个,而是一堆,是系统内具有特殊用途的变量。如:PATH、PWD、USER、HOME等。
环境变量的认识
首先,要说明,每当启动系统时,环境变量就已被系统开辟完毕,我们可使用env指令进行查看系统下的所有环境变量以及环境变量对应的数据。
[zhujunhao@bogon code]$ env
........USER=zhujunhao
PATH=.........
PWD=/home/zhujunhao/code
HOME=/home/zhujunhao
........
查看单个环境变量的数据时,只需输入:echo $环境变量。如echo $PATH、echo $PWD等。
[zhujunhao@bogon code]$ echo $USER
zhujunhao
[zhujunhao@bogon code]$ echo $PWD
/home/zhujunhao/code
我们也可以创建环境变量。在Linux中,export命令用于创建环境变量,unset删除环境变量。如export ENV=12,创建存放12的环境变量,unset ENV删除ENV环境变量。
[zhujunhao@bogon code]$ export ENV=12
[zhujunhao@bogon code]$ echo $ENV
12[zhujunhao@bogon ~]$ unset HHH //删除HHH环境变量
每个环境变量对应的数据就是其功能的代表,它具有特殊的意义,下面会详细介绍其功能。
命令行参数
在认识环境变量的功能前,我们来学习一下命令行参数。在Linux中,在我们启动的非图形化界面时的命令行时,实际上就是bash(或shell)给我们输出的命令行字符串,对应的小部分代码样例如下:
printf("[zhujunhao@bogon code]$ ");//输出指令行,不同机器的数据可能有些不同
char buffer[1024];//指令数组,存入相关指令的字符串scanf("%s, buffer");//从输入流中输入指令
该命令行还可以与我们写入的代码程序联系起来。在平常我们写入C/C++程序时,主函数中其实也可以有参数。main主函数中的参数是从bash指令行中维护、创建、传参,即这些参数通常在命令行中传递给程序,并可以通过main函数的参数进行访问。样例如下:
int main(int n, char* news[],char* S[]) //其中,第一个整型参数n表示命令行参数的数量。第二个参数news是一个指向命令行参数字符串数组的指针,命令行中输入的字符串都将放入里面。第三个参数S存放的就是系统下的环境变量
我们先来观察前两个参数的使用。当我们在命令行中运行程序时,输入的参数将会传递给程序,下面的代码是依次访问输入数据的代码。如下:
[zhujunhao@bogon code]$ cat test.cpp
#include
#include
using namespace std;
int main(int n, char* news[])
{
/*int i = 0;
for (i = 0; i < n; i++)
{
cout << "news[" << i << "]: " << news[i] << endl;
}*/
//以下效果一样
for (int i = 0; news[i]; i++)
{
cout << "news[" << i << "]: " << news[i] << endl;
}
return 0;
}[zhujunhao@bogon code]$ g++ -o test.exe test.cpp
//以下是输出指令行中的内容
[zhujunhao@bogon code]$ ./test.exe
news[0]: ./test.exe[zhujunhao@bogon code]$ ./test.exe -a -b -c -d -e
news[0]: ./test.exe
news[1]: -a
news[2]: -b
news[3]: -c
news[4]: -d
news[5]: -e
这种使用通常在命令代码中最常见,通过不同选项,让相同的程序执行内部不同的功能。在bash的指令中,运用的其实就是上面的道理来实现命令逻辑,即命令行参数是指令选项的基础。
[zhujunhao@bogon code]$ cat code.cpp //系统的源代码
#include
#include
using namespace std;
int main(int n, char *s[])
{
if (n != 2)
{
cout << "Error:\n\tPlease Inoput" << endl;
}
else if (strcmp("-1", s[1]) == 0)
{
cout << "test.exe: -1" << endl;
}
else if (strcmp("-2", s[1]) == 0)
{
cout << "test.exe: -2" << endl;
}
else if (strcmp("-3", s[1]) == 0)
{
cout << "test.exe: -3" << endl;
}
else
{
cout << "unknow" << endl;
}
return 0;
}[zhujunhao@bogon code]$ g++ -o code.exe code.cpp
[zhujunhao@bogon code]$ ./code.exe
Error:
Please Inoput//下面的-1、-2、-3、-4可理解为对应设计的选项功能,而./code.exe为设计对应的命令
[zhujunhao@bogon code]$ ./code.exe -1
test.exe: -1
[zhujunhao@bogon code]$ ./code.exe -2
test.exe: -2
[zhujunhao@bogon code]$ ./code.exe -3
test.exe: -3
[zhujunhao@bogon code]$ ./code.exe -4
unknow
main函数中存放环境变量的第三个参数使用样例如下,该代码的功能是输出系统下的所有环境变量,也就是说,环境变量可以被子进程进行下去。
[zhujunhao@bogon code]$ cat test.cpp
//以下代码的S2[i]将会输出所有的环境变量
#include
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;
}
在代码中,我们可使用getenv("环境变量")函数获取指定名字的环境变量,获取成功的话将返回环境变量的数据。
[zhujunhao@bogon code]$ cat test.cpp
#include
#include
#include
using namespace std;
int main()
{
char* str = getenv("USER");
cout << "str(USER): " << str << endl;
return 0;
}[zhujunhao@bogon code]$ g++ -o test.exe test.cpp
[zhujunhao@bogon code]$ ./test.exe
str(USER): zhujunhao
环境变量的作用
环境变量可以很好的帮助系统、用户、应用程序和脚本进行配置和运行。系统下的环境变量非常多,这里我们先认识下PATH、PWD、USER、HOME的功能。
PATH:它告诉shell或bash进程在哪里查找可执行文件。当你在命令行中输入一个命令时,shell会在PATH变量指定的目录中查找该命令的可执行文件。
PWD:存放这当前目录的绝对路径,对应的指令功能是pwd。
USER:它表示当前shell或bash登录的用户。当用户登录系统时,系统会设置USER环境变量为该用户的用户名。这个环境变量在系统运行时始终运转,即使我们在中间切换用户,USER环境变量的值仍然会保持为原来的用户名。
HOME:它表示当前用户的家目录的路径。当用户登录系统时,系统会设置HOME环境变量为该用户的家目录路径。跟USER一样,这个环境变量在系统运行时始终运转。
下面,我们重点说明下PATH环境变量。
当我们使用指令时,系统都会展开 PATH 对应下的路径进行搜索相关指令,所以无论在什么路径下,系统相关的指令都可以使用。而没有在此路径下的指令需根据具体路径来执行。
若想将有关指令跟系统定义相关指令那样,不用加路径可在任意路径下直接使用,这里有两个方法。
方法一:直接把相关指令拷贝到 PATH 对应的 /usr/bin/ 工作命令路径下。
[zhujunhao@bogon code]$ echo $PATH
//系统在以下路径进行查找,每个分隔符对应不同的路径
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/zhujunhao/.local/bin:/home/zhujunhao/bin[zhujunhao@bogon code]$ code.exe //不是系统中PATH路径下对应的指令,系统报错
bash: code.exe: command not found...
[zhujunhao@bogon code]$ ./code.exe //绝对路径下执行可执行文件的指令
Error:
Please Inoput//拷贝自己的指令
[zhujunhao@bogon code]$ sudo cp code.exe /usr/bin/
[sudo] password for zhujunhao://可直接成功运行
[zhujunhao@bogon code]$ code.exe
Error:
Please Inoput
这里需提醒一下,除非我们必要使用,否则不建议把相关指令拷贝系统指令的 PATH 路径下,因为当 PATH 路径下存放过多时,会给系统造成一定的影响。
方法二:直接把自己当前的路径添加到 PATH 这个环境变量里,具体添加如下:
[zhujunhao@bogon code]$ pwd
/home/zhujunhao/code//下面是错误的写法
[zhujunhao@bogon code]$ PATH=/home/zhujunhao/code //这样将会把原有的环境变量直接覆盖//下面才是真正的添加路径的正确写法,这里/home/zhujunhao/code对应的是我们要设置的路径
[zhujunhao@bogon code]$ PATH=/home/zhujunhao/code:$PATH
//可直接成功运行
[zhujunhao@bogon code]$ code.exe
Error:
Please Inoput
若我们真的执行了上面错误的替换指令,其实也不必担心。这里我们的修改环境变量的数据都是存入内存中的。当错误使用时,我们只需要重启系统即可恢复,系统会重新对环境变量初始化,恢复原有的数据。
总:环境变量的好处很多在于它具有全局属性,可以被所有的子进程或孙子进程进行继承,而且也可在任意情况下使用,如PATH等,它们帮助系统、用户、应用程序和脚本进行配置和运行。