为什么 eval 不能与命令替换一起使用?

为什么 eval 不能与命令替换一起使用?

我有这个命令

$("${DIR}/test.py" "$1")

其输出是

export SOME_VAR="hello world"
export ANOTHER_VAR="hello"

eval $("${DIR}/test.py" "$1")

似乎什么也没做。我究竟做错了什么?

我想在 shell 脚本中导出这些变量。

完整的 bash 脚本:

#!/bin/bash     
DIR="$(cd `dirname $0` && pwd)" 
eval $("${DIR}/test.py" "$2") 
exit $? 

Python脚本(不是完整的脚本,但给出了一个好主意):

#!/usr/local/bin/python3 
print('export var1="{0}"\nexport var2="{1}"\nexport var3="{2}"\nexport var4="{2}"'.format(string1, string2, string3))

答案1

给出的示例也适用于我,但有一个潜在的麻烦来源:根据定义的值,您可能需要在命令替换周围使用双引号以防止分词和通配符扩展:

eval "$("${DIR}/test.py" "$1")"

请注意,至少,如果输出包含由换行符分隔的多个命令,那么没有双引号会导致麻烦。这是因为如果没有双引号,输出会根据空格(通常是空格、制表符和换行符)分割成“单词”,然后eval用空格将其拼接在一起。最终结果:所有换行符都被转换为空格,因此所有应该是单独行的命令都被混在一起成为一个长而混乱的命令。

举一个极端的例子,假设 test.py 输出如下:

# Define some variables:
export SOME_VAR="6 * 5"

拆分-扩展-合并过程给出了以下结果命令:

# Define some variables: export SOME_VAR="6 file1.txt file2.txt otherfile.png 5"

(其中“file1.txt file2.txt otherfile.png”是当前目录中的所有文件。)这根本不是您想要的。

答案2

问题在于不允许source将变量导出到当前 shell。

相关内容