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