环境变量
编辑环境变量是一个动态命名的值,可以影响运行进程在计算机上的行为方式。它们是进程运行环境的一部分。例如,运行的进程可以查询TEMP环境变量的值以找到存储临时文件的合适位置,也可以查询HOME或USERPROFILE变量以查找运行进程的用户拥有的目录结构。
1979年,它们以现代形式与版本7 Unix一起推出,因此从那时起,它们包含在所有Unix操作系统的风味和变体中,包括Linux和macOS。从1982年的PC DOS 2.0开始,所有后续的Microsoft操作系统,包括Microsoft Windows和OS/2,也将它们作为一项功能包括在内,尽管语法、用法和标准变量名称有所不同。
环境变量的设计
编辑在所有Unix和类Unix系统中,每个进程都有自己的单独环境变量集。默认情况下,创建进程时,它会继承其父进程的重复运行时环境,但父进程在创建子进程时所做的显式更改除外。在API级别,这些更改必须在运行fork
和exec
之间完成。或者,从bash等命令shell中,用户可以通过env
间接调用或使用ENVIRONMENT_VARIABLE=VALUE <command>
符号来更改特定命令调用的环境变量。正在运行的程序可以出于配置目的访问环境变量的值。
Shell脚本和批处理文件使用环境变量将数据和首选项传递给子进程。它们还可用于存储临时值,供稍后在shell脚本中引用。然而,在Unix中,不导出变量更可取,因为它们不会泄漏到进程之外。
在Unix中,在脚本或编译程序中更改的环境变量只会影响该进程,也可能影响子进程。父进程和任何无关的进程都不会受到影响。同样,在COMMAND.COM
存在期间,更改或删除DOS批处理文件中的变量值将更改变量。
在Unix中,环境变量通常在系统启动期间由系统init启动脚本初始化,因此由系统中所有其他进程继承。用户可以,而且经常在他们正在使用的命令外壳的配置文件脚本中增强它们。在Microsoft Windows中,每个环境变量的默认值存储在Windows注册表中或设置在AUTOEXEC.BAT
文件中。
在Unix上,setuid程序由其调用方选择的环境,但它以不同于调用方的权限运行。动态链接器通常会从环境变量$LD_LIBRARY_PATH
和$LD_PRELOAD
指定的位置加载代码,并使用进程的权限运行它。如果setuid程序这样做了,它将不安全,因为其调用者可能会让它运行任意代码,从而滥用其权限。为此,libc在setuid进程中启动时取消设置这些环境变量。setuid程序通常取消设置未知环境变量并检查其他环境变量或将其设置为合理的值。
环境变量的语法
编辑这些变量可以在脚本和命令行中使用。它们通常通过在变量名称之前或周围放置特殊符号来引用。例如,要显示用户主目录,在大多数脚本环境中,用户必须键入:
echo $HOME
在DOS、OS/2和Windows命令行解释器(如COMMAND.COM
和cmd.exe
)中,用户必须键入以下类型:
回声%HOME%
在Windows PowerShell中,用户必须键入以下类型:
写入输出$env:HOMEPATH
env
、set
和printenv
命令显示所有环境变量及其值。printenv
也可以通过将该变量名称作为命令的xxx参数来打印单个变量。
分配
env
和set
命令也用于设置环境变量,通常直接集成到shell中。
Unix
在Unix中,以下命令也可以使用,但通常依赖于特定的shell。
VARIABLE=value #伯恩和相关贝壳的出口变量#
导出 ksh、bash 和相关 shell 的 VARIABLE=value #
csh和相关shell的setenv变量值#
一些简单的原则指导环境变量如何实现其效果。
环境变量是设置过程的局部变量。如果生成两个shell进程,并且环境变量的值在一个进程中更改,则另一个进程将看不到该更改。
创建子进程时,它将从父进程继承所有环境变量及其值。通常,当一个程序调用另一个程序时,它首先通过分叉创建一个子进程,然后子进程根据需要调整环境,最后子进程用要调用的程序替换自己。此过程使调用程序控制被调用程序的环境。
在Unix和类Unix系统中,环境变量的名称区分大小写。
In Unix shells, variables may be assigned without the export
keyword. Variables defined in this way are displayed by the set
command, but are not true environment variables, as they are stored only by the shell and are unknown to all other processes. The printenv
command will not display them, and child processes do not inherit them.
VARIABLE=value
前缀语法在不影响当前进程的情况下将“真实”环境变量导出给子进程:
VARIABLE=value program_name
环境变量的持久性可以是会话范围的,也可以是系统范围的。
unset是由Unix命令行shell的Bourne shell家族(sh、ksh、bash等)和C shell家族(csh、tcsh等)实现的内置命令。它取消设置shell变量,将其从内存和shell的导出环境中删除。它作为内置的外壳实现,因为它直接操作外壳的内部。不能取消设置只读 shell 变量。如果试图取消只读变量的设置,取消设置命令将打印错误消息并返回非零退出代码。
DOS、OS/2和Windows
在DOS、OS/2和Windows命令行解释器(如COMMAND.COM
和cmd.exe
)中,SET命令用于使用以下参数分配环境变量和值:
设置VARIABLE=value
SET
命令没有任何参数,显示所有环境变量及其值。
环境变量示例
编辑环境变量的例子包括:
PATH
:目录路径列表。当用户键入命令而不提供完整路径时,会检查此列表,以查看它是否包含指向该命令的路径。HOME
(类Unix)和USERPROFILE
(Microsoft Windows):指示用户的家庭目录在文件系统中的位置。HOME/{.AppName}
(Unix-like) andAPPDATA{DeveloperNameAppName}
(Microsoft Windows): for storing application settings. Many applications incorrectly useUSERPROFILE
for application settings in Windows:USERPROFILE
should only be used in dialogs that allow user to choose between paths likeDocuments/Pictures/Downloads/Music
; for programmatic purposes,APPDATA
(for roaming application settings shared across multiple devices),LOCALAPPDATA
(for local application settings) orPROGRAMDATA
(for application settings shared between multiple OS users) should be used.TERM
(Unix-like): specifies the type of computer terminal or terminal emulator being used (e.g.,vt100
ordumb
).PS1
(类Unix):指定提示符如何在伯恩壳和变体中显示。MAIL
(类Unix):用于指示在哪里可以找到用户的邮件。TEMP
:进程可以存储临时文件的位置。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/122249/