Linux 环境变量名称中允许的字符

2024-10-09 09:10:00
admin
原创
347
摘要:问题描述:Linux 环境变量名允许使用哪些字符?我粗略地搜索了手册页和网络,只找到了有关如何使用变量的信息,但没有找到允许使用哪些名称的信息。我有一个 Java 程序,它需要一个包含点的定义环境变量,例如com.example.fancyproperty。在 Windows 中我可以设置该变量,但在 Lin...

问题描述:

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 变量名相同的规则,即

  1. az、AZ_和 0-9

  2. 不能以数字开头

因此这会排除.它们内部。任何非法变量名都将被记为unknown command

这已在 ZSH 中进行了测试,它与 BASH 基本兼容。

解决方案 4:

是的,你可以做到。

使用execenv命令来实现这个场景。

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

发生什么事?

  1. Shell 调用内置 exec

  2. Shell 内置 exec 调用 syscall.exec 创建进程“env”来替换当前 shell

  3. 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"

并且这一切都没有问题。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2941  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1803  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   31  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   31  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用