Linux环境变量名中允许的字符
1. 概述
在本文中,我们将介绍 Linux 系统的环境变量,以及如果我们要创建新的或修改现有的,我们需要了解哪些规则。本文将重点介绍环境变量的语法。
2. 环境变量
要开始我们的讨论,最好先看一下 Linux 系统上的环境变量。为此,我们可以键入printenv 命令来查看它们:
$ printenv
SHELL=/bin/bash
SESSION_MANAGER=local/username-VirtualBox:@/tmp/.ICE-unix/1644,unix/username-VirtualBox:/tmp/.ICE-unix/1644
QT_ACCESSIBILITY=1
COLORTERM=truecolor
...
PATH=/home/username/anaconda3/bin:/home/username/anaconda3/condabin:/home/username/.local/bin:...
GDMSESSION=ubuntu
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
_=/usr/bin/printenv
上面的输出显示了我们当前机器登录会话的环境变量列表。在这里,我们可以很容易地找到NAME=VALUE的模式。因此,我们需要注意不要在命名环境变量时使用等号( “ = ” )字符。
3. 环境变量定义
从 IEEE 和 The Open Group 发布的 The Open Group Base Specifications (AKA POSIX 法规)第 8 章文档中,我们可以找到环境变量构成的一般定义。除了使用等号(“ = ”)字符外,还有一些关于可用字符的一般规定。
3.1. 使用便携式字符
为了确保我们的程序适用于所有机器,我们需要使用Open Group Base Specifications 第 6 章中定义的Portable Character Set中的字符 (NUL除外)。这些字符由POSIX.1-2017 定义,并且在已正确安装的 Linux 系统中始终可用。
只允许使用此字符集中 的大写字母、小写字母和下划线。
3.2. 注意案例
系统环境变量由大写字母、数字和下划线(“ _ ”)组成。然而我们仍然可以用小写字母定义环境变量。此外,字母代表不同的含义,因此我们不想将放在一起。
按照惯例,小写字母仅供应用程序使用。
3.3. 不要以数字开头
**某些应用程序无法处理以数字开头的环境变量。**如果我们以这种方式定义这些变量,可能会出现意外的行为。 POSIX 文档和我们都不建议在任何地方创建以此类数字开头的环境变量。
3.4. 变量名冲突
下表显示了我们需要避免冲突的变量,其中大部分是系统定义的,并且有一些特殊用途。 关键字表在这里:
ARFLAGS | IFS | MAILPATH | PS1 |
CC | LANG | MAILRC | PS2 |
CDPATH | LC_ALL | MAKEFLAGS | PS3 |
CFLAGS | LC_COLLATE | MAKESHELL | PS4 |
CHARSET | LC_CTYPE | MANPATH | PWD |
COLUMNS | LC_MESSAGES | MBOX | RANDOM |
DATEMSK | LC_MONETARY | MORE | SECONDS |
DEAD | LC_NUMERIC | MSGVERB | SHELL |
>EDITOR | LC_TIME | NLSPATH | TERM |
ENV | LDFLAGS | NPROC | TERMCAP |
EXINIT | LEX | OLDPWD | TERMINFO |
FC | LFLAGS | OPTARG | TMPDIR |
FCEDIT | LINENO | OPTERR | TZ |
FFLAGS | LINES | OPTIND | USER |
GET | LISTER | PAGER | VISUAL |
GFLAGS | LOGNAME | PATH | YACC |
HISTFILE | LPDEST | PPID | YFLAGS |
HISTORY | PRINTER | ||
HISTSIZE | MAILCHECK | PROCLANG | |
HOME | MAILER | PROJECTDIR |
系统非常频繁地调用这些变量。因此,与它们发生冲突可能会导致严重错误。