设置包含破折号的环境变量

设置包含破折号的环境变量

我读过多个帖子,似乎无法在 Centos 7.5 中导出带有特殊字符的变量(我相信特殊字符是问题所在,如果是其他问题,请纠正我)。该命令export TEST-ME=blah返回-bash: export: TEST-ME=blah: not a valid identifier。我尝试使用反斜杠和单引号和双引号的多个变体进行转义,但结果相同。我究竟做错了什么?

答案1

尽管环境变量可以包含任何字符或非字符,但 NUL 和 除外 =exportPOSIX 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=blahTEST__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到环境中的方法。

相关内容