我读过多个帖子,似乎无法在 Centos 7.5 中导出带有特殊字符的变量(我相信特殊字符是问题所在,如果是其他问题,请纠正我)。该命令export TEST-ME=blah
返回-bash: export: TEST-ME=blah: not a valid identifier
。我尝试使用反斜杠和单引号和双引号的多个变体进行转义,但结果相同。我究竟做错了什么?
答案1
尽管环境变量可以包含任何字符或非字符,但 NUL 和 除外 =
,export
POSIX shell 的特殊内置函数导出一个壳随环境变化。
在大多数类似 Bourne 的 shell 中,shell 变量必须以字母字符(通常仅限于 POSIX 可移植字符集的字符)或下划线开头,后跟字母数字字符(或下划线)。-
通常不被归类为字母数字字符。
要运行在其环境中传递的命令TEST-ME=blah
,您可以执行以下操作:
env TEST-ME=blah a-command
rc
它的派生类可以在其 shell 变量中包含任何字符,并且 shell 变量会自动导出到 shell 执行的命令的环境中。
然而,使用 Byron Rakitzis 的变体(与现在开源的 Plan9 / Unix V10 中的原始变体相反),可移植字符集中除了数字和下划线之外的字符被编码为_xx
其中xx
是字节值的十六进制表示形式构成这些字符。
因此,使用rc
,您可以执行以下操作:
TEST-ME = blah; my-command
但根据rc
实现的不同,my-command
将获取TEST-ME=blah
或TEST__2dME=blah
处于从 shell 接收的环境中。
无论如何,使用包含除可移植字符集中的数字之外的字符(或以数字开头或为空)的环境变量名称都是一个坏主意,因为包括某些 shell(例如mksh
)在内的多个应用程序会在导入时删除它们。
例如,
env TEST-ME=blah mksh -c 'printenv TEST-ME'
什么也不返回。
对于其他 shell,您始终可以重新执行传递到其环境的 shell TEST-ME=blah
。虽然 shell 不会将这些环境变量映射到 shell 变量,但其中一些仍会将它们传递给它们执行的命令。所以:
exec env TEST-ME=blah /proc/self/exe
例如,这将是一种添加TEST-ME=blah
到环境中的方法。