环境变量简介
环境变量初接触
我们都听过环境、环境变量等等名词。那么,它的本质到底是什么呢?
命名
假设现在有一个程序对象:
akdhihei
你知道这是个什么高级语法吗?
对的,这就是我胡乱打的,我也不知道它是什么。
那么再看一个对象:
path
这可能就有些熟悉了,配置过环境的同学都知道,path是我们的环境变量。
再看:
a
a又是什么呢?与上面的path类比,那么a就是一个变量呗!
那么这个变量有什么含义吗?没有!
那么现在再反问,上面的path有意义吗?
你可能说:有!它是环境变量!
但是上面那个path是谁的环境变量,它又指向了谁!
你可能有一点点明白了!
这些变量:akdhihei、path、a他们都是变量,本质可以说是容器可以存放值,也可以说是一个程序的对象,它本身没有意义!
它就是一个名称罢了,我们称之为命名。
环境
那么,怎样才能让命名有意义呢?
没错,就是给他赋值!
也可以说,没有值的变量并没有存在的意义
(你是不是联想到了,你写Python,Java的时候,当你没有使用某个变量,没有赋值,只是定义的时候,编辑器会有小波浪,向你提出warnings!)
现在你应该明白了,定而不用,就是没有意义,没有价值,浪费内存资源。因为这个内存(地址)就被占了。用一句话概括就是,占着茅坑不拉屎!
为了让它有意义,应该干嘛?赋值!
比如:
#define a 5
#define akdhihei 8
那么现在可以说,这些被命名的对象们有了意义。它们和某一个具体的值联系起来了,后面的程序中,你看到a就知道它代表5!看到akdhihei就知道它代表8!
print(a + 1)
你一定知道这个程序的结果是什么。而在a被赋值之前,你并不知道!
那么这个操作的本质是什么呢?
是值与符号进行关联,关联之后,又可以通过符号提取数值。那么这是怎么做到的呢?解释器会维护着这样一种储存能力,以便保持着有关的名字-值对偶的关联!
而这种存储,就被称之为环境,(更加准确是,全局环境),那么局部变量,和其它不同作用域,就是不同的环境!这就是环境的本质!
path环境变量
刚刚所说的是广义的环境。那么以path代表的环境变量是环境概念下的子集。
以python环境为例,在没有配置python环境之前,你在CMD终端中输入python,会显示
'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。
而你把python环境配置一下之后,就可以了。
那其中到底干了什么呢?
其本质就是,path是一个变量,里面储存着一些文件的路径。在CMD命令行中输入命令的时候,系统会去path里面找相应的程序(或者在写程序的时候对调用path的路径等等)。比如说你的python.exe 路径为"E:/",你把"E:/"加入到环境变量path中,那么就可以找到了,就可以在终端中运行了。
那么,这个概念依旧是名字-值的关联。path是名字,文件路径是"E:/",环境变量这个狭义概念的赋予是因为,在windows系统中,CMD会通过path中提供的路径去搜寻,如果没有在path中配置(把路径赋值给path),就找不到,就可以通过CMD执行(你手动进入那个文件夹,鼠标点击运行是一点问题也没有的!)。这相当于在Windows下的一个CMD运行环境path,CMD是系统级别的,所以这个环境比较高级。上面的a=5这个环境就很不重要了!但他们的本质都是一样的——
那就是字符(名称)-值的关联。
配置环境=把变量(path)和值(文件路径)关联上这一行为过程
再解释一下
我们在命令提示符下输入msedge.exe时提示不是内部或者外部命令,而输入全路径(目录)的时候就没有问题。实际上,我们输入命令的时候,系统会在一些目录里去寻找是否有对应的命令。如果有就执行它,如果没有就冒出上面的提示。而如果输入全路径,则在给定的路径(目录)里去寻找对应的命令。这里说到的“一些目录”就是有系统的一个环境变量(PATH)所记录的目录。Windows下的PATH环境变量是以";"分割的若干个值,每个值是一个目录。Windows下的PATH环境变量可以通过"此电脑"->"属性"->"高级系统设置"->"环境变量"打开,选中Path,再点"编辑"就可以修改Path环境变量了。如果我们新建一条,把msedge.exe所在的目录加进去,然后确认退出。那再在命令提示符下就可以直接以msedge.exe启动浏览器了,而不需要再输入全路径。
Linux下的PATH
环境变量是以":"分割的若干个值,每个值就是一个目录。如果使用的是bash,可以以export PATH=/new/directory:\$PATH
命令临时修改PATH
环境变量。也可以放在~/.bashrc
里使得每次登录Linux的时候对PATH
的修改都是有效。
linux下最重要的几个环境变量是PATH
、INCLUDE_PATH
和 LD_LIBRARY_PATH
。PATH
决定命令到哪里去找(目录间有优先级哦,越靠近前面优先级越高),INCLUDE_PATH
决定编译程序的时候系统到哪里去找那些被包含的头文件,LD_LIBRARY_PATH
决定系统到哪里去找加载的共享链接库。Windows下类似。
到底什么是环境变量
环境变量是操作系统中存储和管理配置信息的一种机制。它们是在操作系统中定义的命名值对,用于指定应用程序、脚本和系统组件之间的通信和交互。
在Windows和Linux系统中,环境变量包含一些重要的配置信息,如系统路径、程序的安装路径、临时文件夹路径等。这些变量可以在系统的任何位置被访问和使用,而不需要硬编码在应用程序或脚本中。
环境变量在操作系统和应用程序之间起到了桥梁的作用。它们提供了一种标准化的方法,使不同的程序能够共享配置信息,而不必直接修改源代码。通过使用环境变量,可以轻松地更改系统的配置,而无需重新编译或重新安装应用程序。
在Windows系统中,可以使用图形界面或命令行工具(如系统属性、控制面板或set命令)来管理环境变量。在Linux系统中,可以通过命令行工具(如export、setenv等)来设置和修改环境变量。
一些常见的环境变量包括:
PATH
:指定可执行程序的搜索路径,当我们在命令行中输入命令时,操作系统会按照PATH变量指定的路径搜索可执行程序。HOME
:指定当前用户的主目录路径。JAVA_HOME
:指定Java开发环境的安装路径。TEMP
(或TMP
):指定用于存储临时文件的目录路径。
通过设置环境变量,可以方便地配置系统和应用程序的行为,提高应用程序的灵活性和可移植性,并简化系统管理和部署的过程。
Windows下如何设置环境变量
在Windows系统中,有多种方法可以设置环境变量。下面我将介绍两种常用的方法:
方法一:使用系统属性设置环境变量
- 右键点击计算机(或此电脑)图标,选择"属性"。
- 在打开的窗口中,点击"高级系统设置"。
- 在"系统属性"窗口中,点击"环境变量"按钮。
- 在"用户变量"或"系统变量"部分,可以分别对当前用户或整个系统设置环境变量。选择对应的部分,点击"新建"按钮。
- 输入环境变量的名称和值,然后点击"确定"。
- 完成后,点击"确定"关闭所有打开的窗口。
方法二:使用命令行设置环境变量
打开命令提示符(按Win+R,输入"cmd",然后点击"确定")或者使用PowerShell。
使用以下命令设置用户级环境变量:
setx 变量名 "变量值"
例如,要设置名为"JAVA_HOME"的环境变量,可以使用以下命令:
setx JAVA_HOME "C:\Java\jdk"
如果要设置系统级环境变量,需要使用管理员权限运行命令提示符或PowerShell。
执行命令后,将显示一个成功的消息。
请注意,使用第一种方法设置的环境变量不会立即在已经打开的命令提示符或PowerShell窗口中生效。需要重新启动窗口或打开新的窗口才能使用新设置的环境变量。使用第二种方法设置的环境变量只会在当前回话中有效。
Linux下如何设置环境变量
在Linux系统中,可以通过在bash shell的配置文件中设置环境变量。以bash为例,下面是一种常用的方法:
打开终端,进入到当前用户的主目录。
使用文本编辑器(如vi、nano等)打开
.bashrc
文件,这是bash的配置文件之一。vi ~/.bashrc
在文件的末尾添加你想要设置的环境变量,例如:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
这里将
JAVA_HOME
环境变量设置为Java安装路径。保存并关闭文件。
在终端中执行以下命令,使配置生效:
source ~/.bashrc
或者直接注销并重新登录。
验证环境变量是否设置成功,可以使用以下命令:
echo $JAVA_HOME
如果显示了设置的路径,则说明环境变量设置成功。
通过在.bashrc
文件中设置环境变量,每次打开新的终端窗口时,bash shell都会自动加载这些变量。这样,你就可以在终端中使用这些环境变量,或者在脚本中引用它们。
请注意,如果你需要在系统级别设置环境变量,可以编辑/etc/environment
文件或在/etc/profile.d/
目录下创建一个.sh
文件,并在其中设置环境变量。但这些操作可能需要管理员权限。
有哪些重要的环境变量
以下是其中一些常见的重要环境变量:
PATH
:指定可执行程序的搜索路径。当你在终端中输入命令时,系统会按照PATH变量指定的路径搜索可执行程序。INCLUDE_PATH
: 指定编译器在编译过程中查找头文件(header files)的路径。头文件包含了程序中所需的函数和数据结构的声明。LD_LIBRARY_PATH
:指定动态链接库(shared libraries)的搜索路径。当你运行依赖于动态链接库的可执行程序时,系统会在该路径下查找所需的库文件。HOME
:指定当前用户的主目录路径。通常在命令行中使用波浪符(~)表示该路径。USER
:当前登录用户的用户名。SHELL
:指定当前用户所使用的Shell程序的路径。PS1
:定义命令行提示符的格式。你可以自定义命令行提示符的外观,例如设置为显示当前目录或用户名。LANG
:指定系统默认的语言环境。LC_ALL
:指定所有区域设置(Locale)的设置。它会覆盖其他与区域设置相关的环境变量,如LC_COLLATE
、LC_TIME
等。
这只是一小部分常见的重要环境变量。实际上,系统和应用程序可以定义和使用许多其他环境变量,以满足特定的需求和配置要求。
PATH
PATH
是一个非常重要的环境变量,用于指定可执行程序的搜索路径。当你在终端或命令提示符中输入命令时,系统会按照PATH
变量指定的路径来查找可执行程序。
操作系统会按照PATH
环境变量中指定的路径顺序逐个搜索命令,直到找到匹配的可执行程序或搜索完所有路径。如果找到匹配的可执行程序,系统将执行该程序;如果没有找到匹配的程序,系统将显示"命令未找到"(Command not found)的错误。
在PATH
环境变量中,不同的路径由冒号(Linux、Unix系统)或分号(Windows系统)分隔开。
示例:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
上述示例中的PATH
环境变量包含了5个路径,每个路径都是可执行程序的搜索路径。当你在终端中输入一个命令时,系统会按照这些路径的顺序依次搜索命令。
可以通过修改PATH
环境变量来添加或修改可执行程序的搜索路径。这对于安装新的软件、使用自定义的脚本或工具以及管理系统的执行环境非常有用。
注意,为了避免安全风险,应小心管理PATH
环境变量,确保只包含可信任的路径,并避免在PATH
中包含当前目录(.
)或不受信任的目录。这可以减少恶意软件或攻击者利用恶意程序替代系统命令的风险。
INCLUDE_PATH
INCLUDE_PATH
是一个常见的环境变量,用于指定编译器在编译过程中查找头文件(header files)的路径。头文件包含了程序中所需的函数和数据结构的声明。
当编译源代码时,编译器需要访问相关的头文件来了解函数和数据结构的定义。如果头文件位于非标准位置,编译器默认不会自动查找它们。这时,可以通过设置INCLUDE_PATH
环境变量告诉编译器额外的头文件搜索路径。
具体的设置方式因编译器而异。在常见的C/C++编译器中,如GCC(GNU Compiler Collection)或Clang,可以通过以下方式设置INCLUDE_PATH
环境变量:
在bash shell中:
export INCLUDE_PATH=/path/to/include
在Windows的命令提示符中:
set INCLUDE_PATH=C:\path\to\include
请注意,上述命令中的/path/to/include
或C:\path\to\include
应替换为实际的头文件所在目录路径。
设置了INCLUDE_PATH
环境变量后,编译器将在指定的路径下搜索头文件,使其可被源代码正确引用。这样可以更方便地组织头文件的位置,特别是在项目中使用了自定义的头文件或第三方库的头文件时。
LD_LIBRARY_PATH
LD_LIBRARY_PATH
是一个用于指定动态链接库(shared libraries)搜索路径的环境变量。在Linux系统中,可执行程序在运行时可能需要依赖某些共享库,而LD_LIBRARY_PATH
变量可以告诉系统在哪些目录中搜索这些共享库。
当你运行一个可执行程序时,操作系统会使用预定义的默认路径搜索共享库。然而,有时共享库可能位于非标准位置,或者你希望在运行时使用其他版本的共享库。这时,可以通过设置LD_LIBRARY_PATH
环境变量来指定额外的共享库搜索路径。
具体的设置方式如下:
在bash shell中:
export LD_LIBRARY_PATH=/path/to/lib
在Windows的命令提示符中:
set LD_LIBRARY_PATH=C:\path\to\lib
请注意,上述命令中的/path/to/lib
或C:\path\to\lib
应替换为实际的共享库所在目录路径。
设置了LD_LIBRARY_PATH
环境变量后,可执行程序在运行时将在指定的路径下搜索共享库。这样可以方便地使用自定义的共享库或指定特定版本的共享库,而不必将其放置在默认的系统库路径下。
需要注意的是,LD_LIBRARY_PATH
是一个影响系统范围的环境变量,所以在设置时要谨慎。错误的设置可能导致系统出现问题或安全风险。一般建议仅在特定需求下使用LD_LIBRARY_PATH
,并避免滥用。