对于path这个环境变量,我们是用的最多的,这里以此为例:
假如我们在cmd中输入一个link.exe,系统是如何找到正确的link.exe执行的?
这个问题我一直想找到精确的答案,目前却只获取到整个链条中的几段。
下面描述我试图一窥全貌的过程,希望大家能补充缺失的环节,使这条链子串起来。
+ 所知片段1
找寻的第一步——先在当前目录下找(这步应该没错,我可以确信)
如果在当前目录下找到了link.exe,那么直接执行这个可执行文件,无需再继续找寻。
+ 所知片段2
如果在当前目录下没有找到,系统会去一种叫环境变量的地方找寻path这个变量,进而从中获取一些路径。
拿到这些路径,系统会按照某种顺序,从这些地方挨个查找link.exe:
找到就马上执行之,不再继续查找;否则继续往下找,直至找完所有路径。
问题来了:
- 疑问1. 什么是环境变量?
- 疑问2. 环境变量里的值从哪里来?最终提供给程序的值是如何确定的?
- 疑问3. 对于获取到“一些路径”,系统将按照何种顺序依次进行找寻?
+ 所知片段3 (答疑问1)
什么是环境变量?
Environment variables are specially named aliases or placeholders for certain basic system properties that are present for convenience in programming and in system administration。
-- from Environment Variables in Windows XP
意译一下:
环境变量是一组特殊的变量(这里别名/标志符我就直接译为变量了)
它们保存了一些系统的基本属性
这些属性一般用来为程序或系统管理员提供便利
环境变量里面存储的一般是一些路径,文件名,系统参数值等信息
当程序需要这些值时,就可去问询环境变量
环境变量既然能够为程序提供信息,就可以影响程序的行为
比如开始的例子里,command程序执行link.exe,若本目录下未找到link.exe,它接下来的行为就受到了环境变量的影响
一个约定:
为了和下面可能讨论到的其他环境变量相区别,我们把这里所谓的“可影响程序行为的环境变量”称为“最终环境变量”.
后文形形色色的其他也叫“环境变量”的东西,我们姑且认为是“影响最终环境变量”的参数。
程序运行时,如何得知当前程序可利用哪些环境变量?这些变量里的值是什么?
对于一般的程序,应该有相应的API可获取这些值,我不太清楚,这里做个记号以后补上。【mark】
对于批处理程序,可以通过windows提供的set工具来输出此时作用这个批处理程序的所有环境变量以及其中的值。
例如:
-------------
【mark】这里待补充一个例子
---------------
+ 所知片段4 (答疑问