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

2024-10-09 09:10:00
admin
原创
81
摘要:问题描述: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"

并且这一切都没有问题。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用