从TCL变量调用unix程序

Ger*_*alk 1 shell tcl

我的TCL脚本使用TCL变量调用命令行工具.我已经尝试过exec或eval用于命令行,但没有任何效果.

#!/usr/bin/tclsh
set dbg 0
set iso 100
set cmd "gphoto2 --set-config-value /main/imgsettings/iso=${iso}"
if {$dbg} {puts $cmd} else {eval $cmd}
Run Code Online (Sandbox Code Playgroud)

给:

invalid command name "gphoto2"
while executing
"gphoto2 --set-config-value /main/imgsettings/iso=100"
("eval" body line 1)
invoked from within
"eval $cmd"
invoked from within
"if {$dbg} {puts $cmd} else {eval $cmd}"
(file "./canon.tcl" line 22)
Run Code Online (Sandbox Code Playgroud)

如果尝试{ exec $cmd }但是也没有用.

couldn't execute "gphoto2 --set-config-value /main/imgsettings/iso=100": no such file or directory
while executing
"exec $cmd"
invoked from within
"if {$dbg} {puts $cmd} else {exec $cmd}"
(file "./mofi_canon.tcl" line 22)
Run Code Online (Sandbox Code Playgroud)

我尝试给出绝对路径名/usr/bin/gphoto2但又没有成功.我想这个问题与整个命令字符串是一个对象有关,而unix执行不能解析它.但是正确地将它交给shell的方法是什么?

从linux命令行当然命令工作正常.

@ubuntu:~/TCL$ gphoto2 --summary                                        
Camera summary:                                                                
Manufacturer: Canon Inc.
Model: Canon EOS DIGITAL REBEL XSi
Run Code Online (Sandbox Code Playgroud)

这是来自kubuntu 14.04 linux.

uname -a
Linux ubuntu 3.13.0-36-generic #63-Ubuntu SMP Wed Sep 3 21:30:07 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

谢谢和干杯,格特

Din*_*esh 5

如果您使用的是tcl 8.5或更高版本,那么您可以使用如下,

exec {*}$cmd
Run Code Online (Sandbox Code Playgroud)

否则,请使用以下代码

eval exec $cmd
Run Code Online (Sandbox Code Playgroud)

让我们考虑一个例子

example.tcl

#usr/bin/tclsh
puts $argc
puts [ lindex $argv 0 ]
puts [ lindex $argv 1 ]
Run Code Online (Sandbox Code Playgroud)

execargs.tcl

#usr/bin/tclsh

#Calling the example.tcl file with the command line args
set cmd "tclsh example.tcl 1 2"

#For Tcl versions less than 8.5, this will work
puts [ eval exec $cmd ] 

#For Tcl 8.5 or higher, this will work
puts [ exec {*}$cmd ] 
Run Code Online (Sandbox Code Playgroud)