Contents

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 MAIL PRINTER
HISTSIZE MAILCHECK PROCLANG
HOME MAILER PROJECTDIR

系统非常频繁地调用这些变量。因此,与它们发生冲突可能会导致严重错误。