Linux 环境变量名称中允许的字符
- 2024-10-09 09:10:00
- admin 原创
- 81
问题描述:
Linux 环境变量名允许使用哪些字符?我粗略地搜索了手册页和网络,只找到了有关如何使用变量的信息,但没有找到允许使用哪些名称的信息。
我有一个 Java 程序,它需要一个包含点的定义环境变量,例如com.example.fancyproperty
。在 Windows 中我可以设置该变量,但在 Linux 中却无法设置它(在 SuSE 和 Ubuntu 中尝试过)。该变量名是否允许?
解决方案 1:
来自开放群组:
这些字符串的形式为 name=value;名称不得包含字符“=”。为了使值能够在符合 IEEE Std 1003.1-2001 的系统之间移植,该值应由可移植字符集中的字符组成(NUL 除外,如下所示)。
因此名称可以包含除 = 和 NUL 之外的任何字符,但是:
IEEE Std 1003.1-2001 的 Shell 和实用程序卷中的实用程序使用的环境变量名称仅由大写字母、数字和可移植字符集中定义的字符中的“_”(下划线)组成,并且不以数字开头。实现可能允许使用其他字符;应用程序应容忍此类名称的存在。
因此,虽然名称可能有效,但您的 shell 可能不支持除字母、数字和下划线之外的任何内容。
解决方案 2:
IEEE Std 1003.1-2008 / IEEE POSIX P1003.2/ISO 9945.2 Shell 和工具标准的 POSIX 标准关于 shell 的部分
没有定义变量名的词汇约定,然而粗略地
看一下源代码就会发现它使用了类似于
[a-zA-Z_]+[a-zA-Z0-9_]*
(编辑:在第二个字符类中添加了缺失的下划线。)
需要注意的是,由于某些 shell 不支持正则表达式中的 +,因此可能更具可移植性的正则表达式可能是:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
解决方案 3:
我的快速测试表明,它们基本上遵循与 C 变量名相同的规则,即
az、AZ
_
和 0-9不能以数字开头
因此这会排除.
它们内部。任何非法变量名都将被记为unknown command
。
这已在 ZSH 中进行了测试,它与 BASH 基本兼容。
解决方案 4:
是的,你可以做到。
使用exec
和env
命令来实现这个场景。
Docker 中的测试装置
docker run -it --rm alpine:3.10
在容器中运行命令:
exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}
验证环境变量:
HOSTNAME=bd0bccfdc53b
SHLVL=2
HOME=/root
spring.application_name=happy-variable-name
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
用于ps aux
验证 PID 没有改变
PID USER TIME COMMAND
1 root 0:00 /bin/sh
12 root 0:00 ps aux
用于python
验证环境变量
apk add python
python -c 'import os; print(os.environ["spring.application_name"])'
输出是happy-variable-name
。
发生什么事?
Shell 调用内置 exec
Shell 内置 exec 调用 syscall.exec 创建进程“env”来替换当前 shell
env 进程调用 syscall.execvp 创建进程 '/bin/sh' 来替换 env 进程
另一种方式
Docker 映像
如果你正在使用docker,你可以在Dockerfile中设置变量
FROM busybox
ENV xx.f%^&*()$#ff=1234
Kubernetes 配置图
如果你使用 kubernetes,你可以通过 ConfigMap 设置变量
测试文件
apiVersion: v1
kind: ConfigMap
metadata:
name: foo-config
data:
"xx.ff-bar": "1234"
---
apiVersion: v1
kind: Pod
metadata:
name: foobar
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: foo-config
restartPolicy: Never
部署 Podkubectl apply -f test.yaml
验证kubectl logs foobar
输出:
xx.ff-bar=1234
ConfigMap 允许‘-’、‘_’或‘.’
解决方案 5:
取决于你所说的‘允许’是什么意思。
忽略 Windows 的随机数:
环境是一个字符串数组,传递给程序的主函数。如果您阅读过 execve(2),您会发现除了空终止符外,这些字符串没有任何要求或限制。
按照惯例,每个字符串都由 NAME=value 组成。没有引用约定,因此按照此约定,名称中不能有“=”。
普通人通过与 shell 讨论来设置这些字符串。每个 shell 对于什么是有效变量名称都有自己的看法,因此您必须阅读当前 shell 的手册页以了解其看法。
一般来说,像com.baseball.spit=fleagh这样的东西都是Java系统属性,不管某些Java程序是否愿意回退到环境,最好用-D来指定它们。
解决方案 6:
这取决于 shell。我猜你默认使用的是 bash,在这种情况下允许使用字母、数字和下划线,但变量名不能以数字开头。从 Bash v.3 开始,变量名中不允许使用句点。
解决方案 7:
虽然大多数 shell 不允许设置环境变量(如其他答案中所述),但如果您需要,您可以使用非标准环境变量执行其他程序env(1)
。
例如,清除所有环境并设置Strange.Env:Var
为值foo
,然后执行打印它的 perl 程序:
env -i Strange.Env:Var=foo perl -MData::Dumper -E 'say Dumper(%ENV)'
将打印
$VAR1 = {
'Strange.Env:Var' => 'foo'
};
解决方案 8:
在编辑 systemd 服务变量时,systemctl edit <service_name>
我可以使用除" = $
以下之外的所有符号:
[Service]
Environment="TOKEN=~'+*^,j-;H@[J;;G,g&xG:eH)RfK@I&fjjgdZ|IXKm]-[C"
并且这一切都没有问题。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件