目录
123▪▪▪4
环境变量是一个动态命名的值,可以影响运行进程在计算机上的行为方法。它们是进程运行环境的一部份。诸如,运行的进程可以查询TEMP环境变量的值以找到储存临时文件的合适位置,也可以查询HOME或USERPROFILE变量以查找运行进程的用户拥有的目录结构。
1979年,它们以现代方式与版本7Unix一起推出,因而从那时起,它们包含在所有Unix操作系统的辣味和变体中,包括Linux和macOS。从1982年的PCDOS2.0开始,所有后续的Microsoft操作系统,包括MicrosoftWindows和OS/2,也将它们作为一项功能包括在内,虽然句型、用法和标准变量名称有所不同。
环境变量的设计
在所有Unix和类Unix系统中,每位进程都有自己的单独环境变量集。默认情况下,创建进程时linux系统iso下载,它会承继其父进程的重复运行时环境,但父进程在创建子进程时所做的显式修改除外。在API级别,这种修改必须在运行fork和exec之间完成。或则,从bash等命令shell中,用户可以通过env间接调用或使用ENVIRONMENT_VARIABLE=VALUE符号来修改特定命令调用的环境变量。正在运行的程序可以出于配置目的访问环境变量的值。
Shell脚本和批处理文件使用环境变量将数据和首选项传递给子进程。它们还可用于储存临时值,供稍后在shell脚本中引用。但是,在Unix中,不导入变量更可取,由于它们不会泄露到进程之外。
在Unix中linux查看当前环境变量,在脚本或编译程序中修改的环境变量只会影响该进程,也可能影响子进程。父进程和任何无关的进程都不会遭到影响。同样,在COMMAND.COM存在期间,修改或删掉DOS批处理文件中的变量值将更改变量。
在Unix中,环境变量一般在系统启动期间由系统init启动脚本初始化,因而由系统中所有其他进程承继。用户可以,但是常常在她们正在使用的命令壳体的配置文件脚本中提高它们。在MicrosoftWindows中,每位环境变量的默认值储存在Windows注册表中或设置在AUTOEXEC.BAT文件中。
在Unix上,setuid程序由其调用方选择的环境,但它以不同于调用方的权限运行。动态链接器一般会从环境变量$LD_LIBRARY_PATH和$LD_PRELOAD指定的位置加载代码,并使用进程的权限运行它。假如setuid程序这样做了,它将不安全,由于其调用者可能会让它运行任意代码,因而滥用其权限。因此,libc在setuid进程中启动时取消设置这种环境变量。setuid程序一般取消设置未知环境变量并检测其他环境变量或将其设置为合理的值。
环境变量的句型
这种变量可以在脚本和命令行中使用。它们一般通过在变量名称之前或周围放置特殊符号来引用。比如,要显示用房主目录linux查看当前环境变量,在大多数脚本环境中,用户必须键入:
echo $HOME
在DOS、OS/2和Windows命令行原语(如COMMAND.COM和cmd.exe)中,用户必须键入以下类型:
回声%HOME%
在WindowsPowerShell中,用户必须键入以下类型:
写入输出$env:HOMEPATH
env、set和printenv命令显示所有环境变量及其值。printenv也可以通过将该变量名也称为命令的xxx参数来复印单个变量。
分配
env和set命令也用于设置环境变量,一般直接集成到shell中。
Unix
在Unix中,以下命令也可以使用linux多线程编程,但一般依赖于特定的shell。
VARIABLE=value #伯恩和相关贝壳的出口变量#
导出 ksh、bash 和相关 shell 的 VARIABLE=value #
csh和相关shell的setenv变量值#
一些简单的原则指导环境变量怎样实现其疗效。
环境变量是设置过程的局部变量。假如生成两个shell进程,而且环境变量的值在一个进程中修改,则另一个进程将看不到该修改。
创建子进程时,它将从父进程承继所有环境变量及其值。一般,当一个程序调用另一个程序时,它首先通过分叉创建一个子进程,之后子进程按照须要调整环境,最后子进程用要调用的程序替换自己。此过程使调用程序控制被调用程序的环境。
在Unix和类Unix系统中,环境变量的名称分辨大小写。
InUnixshells,variablesmaybeassignedwithouttheexportkeyword.Variablesdefinedinthiswayaredisplayedbythesetcommand,butarenottrueenvironmentvariables,astheyarestoredonlybytheshellandareunknowntoallotherprocesses.Theprintenvcommandwillnotdisplaythem,andchildprocessesdonotinheritthem.
VARIABLE=value
前缀句型在不影响当前进程的情况下将“真实”环境变量导入给子进程:
VARIABLE=value program_name
环境变量的持久性可以是会话范围的,也可以是系统范围的。
unset是由Unix命令行shell的Bourneshell家族(sh、ksh、bash等)和Cshell家族(csh、tcsh等)实现的外置命令。它取消设置shell变量,将其从显存和shell的导入环境中删掉。它作为外置的壳体实现,由于它直接操作壳体的内部。不能取消设置只读shell变量。假如企图取消只读变量的设置,取消设置命令将复印错误消息并返回非零退出代码。
DOS、OS/2和Windows
在DOS、OS/2和Windows命令行类库(如COMMAND.COM和cmd.exe)中,SET命令用于使用以下参数分配环境变量和值:
设置VARIABLE=value
SET命令没有任何参数,显示所有环境变量及其值。
环境变量示例
环境变量的反例包括: