Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
source包含环境变量的文件,包括;破折号;bash中的角色?_Bash_Environment Variables - Fatal编程技术网

source包含环境变量的文件,包括;破折号;bash中的角色?

source包含环境变量的文件,包括;破折号;bash中的角色?,bash,environment-variables,Bash,Environment Variables,我正在使用bash,有一个名为x.config的文件,其中包含以下内容: MY_VAR=Something1 ANOTHER=Something2 要将这些作为环境变量加载,我只需使用source: $ source x.config 但如果调用MY-VAR,则这不起作用: MY-VAR=Something1 ANOTHER=Something2 如果我做同样的事情,我会得到: x.config:1: command not found: MY-VAR=Something1 我尝试过逃离

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

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

$ source x.config
但如果调用
MY-VAR
,则这不起作用:

MY-VAR=Something1
ANOTHER=Something2
如果我做同样的事情,我会得到:

x.config:1: command not found: MY-VAR=Something1
我尝试过逃离
-
和其他很多事情,但是我被卡住了。有人知道这方面的解决方法吗?

中的破折号(
-
)是不可移植的,正如您所注意到的,会导致很多问题。不能从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

中的破折号(
-
)是不可移植的,正如您所注意到的,将导致许多问题。不能从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

一个纯粹的
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
if[[!-v myscript_env_set]];然后
导出myscript_env_set=1
readarray-t newenv

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

一个可能适用于您的纯
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
if[[!-v myscript_env_set]];然后
导出myscript_env_set=1
readarray-t newenv

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

变量名不能包含连字符为什么不能使用下划线?@Johan
我知道如果使用env'MY-VAR=…'
不可以t@Johan你不能这么做,将应用程序更改为使用有效的环境变量。@123
env'MY-VAR=3'bash
将把变量添加到环境中;它只是没有作为shell环境变量公开。它将被传递给任何可能会使用它的子进程。变量名不能包含连字符为什么不能使用下划线?@Johan
我知道如果你使用env'MY-VAR=..”
不,你不能t@Johan你不能这么做,将应用程序更改为使用有效的环境变量。@123
env'MY-VAR=3'bash
将把变量添加到环境中;它只是没有作为shell环境变量公开。它将被传递给任何可能使用它的子进程。