问题是如何评估从文件读取的完整$变量。
我有python和ksh shell的程序组合。 ksh shell执行一个python脚本,该脚本读取xmlfile&返回一个类路径&出口和销售的可用物品命令执行。
在我的情况下,xml文件如下所示
1<script>
2 <scriptPath>/home/opapp/apps/ampFeed</scriptPath>
3 <JAVA_HOME>/local/opt/sunjava-1.6.0_01/jre</JAVA_HOME>
4 <classpath>"./properties/prod"</classpath>
5 <classpath>"lib/activation.jar"</classpath>
6 <classpath>"lib/antlr-2.7.6.jar"</classpath>
.......
40 <executionCmd>"$JAVA_HOME/bin/java"</executionCmd>
43 <executionCmd>"-Dtarget.db.properties=/home/opapp/apps/ampFeed/properties/pr od"</executionCmd>
44 <executionCmd>"-classpath"</executionCmd>
..........
</script>
我的Shell脚本非常简单
$0 == XMlFile
typeset -x JAVA_HOME=`${HOME}/scripts/readXmlFile.py -s $0 -e "JAVA_HOME"
typeset -x CLASSPATH=`${HOME}/scripts/readXmlFile.py -s $0 -e "CLASSPATH"
EXECUTION_CMD=`${HOME}/scripts/readXmlFile.py -s $0 -e "CLASSPATH"
export JAVA_HOME
export CLASSPATH
print JAVA_HOME=$JAVA_HOME
print CLASSPATH=$CLASSPATH
print EXECUTION_CMD=$EXECUTION_CMD
$EXECUTION_CMD
输出如下: -
JAVA_HOME="/local/opt/java7/jre"
CLASSPATH=:"./properties/dev1":"lib/activation.jar":"lib/antlr-2.7.6.jar":"lib/aopalliance.jar"
EXECUTION_CMD="$JAVA_HOME/bin/java" -Dtarget.db.properties=/home/opappqa/apps/Feed/properties/dev1" "-classpath" "$CLASSPATH" "ampFeed.generator.FeedGenerator" "-Xms128M" "-Xmx512M"
line 41: "$JAVA_HOME/bin/java": not found
问题是如何评估完整的CLASSPATH&amp; JAVA_HOME
答案 0 :(得分:1)
使用eval
将字符串视为代码:
eval "$EXECUTION_CMD"
否则,POSIX sh行为(跟随ksh)仅运行字符串拆分和glob扩展解析阶段,不允许将字符串的任何部分视为语法。
尽管如此,请参阅BashFAQ #50以获取有关以编程方式生成代码的最佳实践的信息。 (有些建议只有bash,但是很多也适用于ksh)。