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

2024-10-09 09:10:00
admin
原创
308
摘要:问题描述: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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用