【问题标题】:source a file containing environment variables including "dash" character in bash?来源一个包含环境变量的文件,包括bash中的“破折号”字符?
【发布时间】:2016-02-02 23:09:00
【问题描述】:

我正在使用 bash,并且有一个名为 x.config 的文件,其中包含以下内容:

MY_VAR=Something1
ANOTHER=Something2

要将这些作为环境变量加载,我只需使用 source:

$ source x.config

但如果 MY_VAR 被称为 MY-VAR,这将不起作用:

MY-VAR=Something1
ANOTHER=Something2

如果我做同样的事情,我会得到:

x.config:1: command not found: MY-VAR=Something1

我尝试过逃避- 和许多其他事情,但我被卡住了。有人知道解决方法吗?

【问题讨论】:

  • 变量名不能包含连字符
  • 为什么不能使用下划线?
  • @Johan Well I know you can escape it if you do env 'MY-VAR=..' 不,你不能
  • @Johan 你不能这样做,改变你的应用程序使用有效的环境变量。
  • @123 env 'MY-VAR=3' bash 会将变量添加到环境中;它只是没有作为 shell 环境变量公开。它将被传递给任何可能使用它的子进程。

标签: bash environment-variables


【解决方案1】:

可能对您有用的纯bash 解决方法是使用env 重新运行脚本以设置环境。将此添加到脚本的开头。

if [[ ! -v myscript_env_set ]]; then
    export myscript_env_set=1
    readarray -t newenv < x.config
    exec env "${newenv[@]}" "$0" "$@"
fi

# rest of the script here

这假定x.config 不包含除变量赋值之外的任何内容。如果myscript_env_set 不在当前环境中,请将其放在那里,以便下一次调用跳过此块。然后将分配读入一个数组以传递给env。使用exec 将当前进程替换为另一个脚本调用,但使用环境中所需的变量。

【讨论】:

    【解决方案2】:

    environment variable 中的破折号 (-) 是不可移植的,正如您所注意到的,它会导致很多问题。你不能从 bash 中设置这些。 修复您要调用的应用程序

    话虽如此,如果您无法更改目标应用程序,则可以通过 python 执行此操作:

    #!/usr/bin/python
    
    import os
    
    with open('x.config') as f:
        for line in f:
            name, value = line.strip().split('=')
            os.environ[name] = value
    
    os.system('/path/to/your/app')
    

    这是一个非常简单的配置阅读器,对于更复杂的语法,您可能需要使用ConfigParser

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 2023-03-07
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多