source包含环境变量的文件,包括;破折号;bash中的角色?
我正在使用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 我尝试过逃离
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你不能这么做,将应用程序更改为使用有效的环境变量。@123env'MY-VAR=3'bash
将把变量添加到环境中;它只是没有作为shell环境变量公开。它将被传递给任何可能会使用它的子进程。变量名不能包含连字符为什么不能使用下划线?@Johan我知道如果你使用env'MY-VAR=..”
不,你不能t@Johan你不能这么做,将应用程序更改为使用有效的环境变量。@123env'MY-VAR=3'bash
将把变量添加到环境中;它只是没有作为shell环境变量公开。它将被传递给任何可能使用它的子进程。