从TCL脚本执行命令

时间:2013-08-08 20:50:07

标签: tcl

当我从unix框运行它时,下面的命令工作正常,但是当我从tcl脚本执行它时它无法正常工作。请帮我解释如何执行命令。

java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml

我尝试了以下代码行

exec "java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml"

eval "java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml"

2 个答案:

答案 0 :(得分:5)

使用单独的参数。

exec java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml

我不确定exec是否在路径中查找,因此最好执行以下操作:

exec {*}[auto_execok java] diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml

或者如果你在8.4(顺便说一下,这是生命的结束)

eval [linsert {exec diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml} 1 [auto_execok java]]

答案 1 :(得分:1)

有三种方法可以做到:

exec java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml

没有引号;每个Tcl单词都成为一个单独的参数。

set command "java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml"
exec {*}$command
# or in 8.4 and before, one of these:
# eval exec $command
# eval [list exec] [lrange $command 0 end]
# eval [linsert $command 0 exec]

或者,如果您更喜欢使用Tcl语法的shell语法:

set command "java -jar diffkit-0.9.0/diffkit-app.jar -planfiles plan.xml"
exec /bin/sh -c $command

当您需要执行复杂的重定向时,最后一个非常有用;他们目前在Bourne shell(及其派生词)中比在Tcl中更容易做到。它(可能)不适用于Windows;不幸的是,相当于通过CMD.EXE发射的东西有点可怕。