我有一个将带引号的字符串放在环境变量中的系统。该环境变量作为命令行参数传递给python程序,但是带引号的字符串被拆分为多个单词,而不是在一起。
例如:
在外壳中:
$ export ARG_OPTIONS='--flag -a 31 --big_complicated_flag "How are you?"'
在bash脚本中:
python args.py $ARG_OPTIONS
在python脚本中:
import sys
print sys.argv
结果是:
['args.py', '--flag', '-a', '31', '--big_complicated_flag', '"How', 'are', 'you?"']
这里重要的是引号中的字符串已被分割成多个部分,这不是程序期望参数的方式。 我不能对此设置进行太多更改,所以任何想法都将不胜感激。
python args.py "$ARG_OPTIONS"
Result: ['args.py', '--flag -a 31 --big_complicated_flag "How are you?"']
这是不正确的,因为整个变量都作为单个参数传递。 但是,我期望这种行为,但我想尝试一下。
python args.py "$ARG_OPTIONS"
Result: ['args.py', '$ARG_OPTIONS']
也不正确,但是从我对单引号的理解中可以预期。
export ARG_OPTIONS="--flag -a 31 --big_complicated_flag \"How are you?\""
Result: ['args.py', '--flag', '-a', '31', '--big_complicated_flag', '"How', 'are', 'you?"']
此结果与原始结果相同。
export ARG_OPTIONS='"--flag -a 31 --big_complicated_flag \"How are you?\""'
Result: ['args.py', '"--flag', '-a', '31', '--big_complicated_flag', '\\"How', 'are', 'you?\\""']
也不正确。
更改IFS分隔符并手动分隔环境变量中的参数:
export ARG_OPTIONS='--flag|-a|31|--big_complicated_flag|How are you?'
在shell脚本中:
IFS='|'
python args.py $ARG_OPTIONS
Result: ['args.py', '--flag', '-a', '31', '--big_complicated_flag', 'How are you?']
这会产生预期的输出,但似乎有点黑,以后容易混淆。显然,关于外壳程序和环境变量之间的交互,我有些不了解。
为什么分隔双引号中的单词?有没有更清洁的方式来实现我的目标?
答案 0 :(得分:-1)
代替
python args.py $ARG_OPTIONS
您可能想使用
eval "python args.py $ARG_OPTIONS"
来自eval的bash帮助:
eval: eval [arg ...]
Execute arguments as a shell command.
Combine ARGs into a single string, use the result as input to the shell,
and execute the resulting commands.
简而言之,eval
再次重新评估了其参数;这样会将一对双引号的文字转换为双引号,从而影响单词拆分。
但是,请注意:此方法存在安全风险-现在可以执行任意代码。