我的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}
给予:
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)
如果尝试{ 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)
我尝试给出绝对路径名/usr/bin/gphoto2
,但再次没有成功。
我想这个问题与整个命令字符串是一个对象有关,而unix执行不能解析它。但是,正确地将它提供给shell的方法是什么?
从linux命令行当然命令工作正常。
@ubuntu:~/TCL$ gphoto2 --summary
Camera summary:
Manufacturer: Canon Inc.
Model: Canon EOS DIGITAL REBEL XSi
这是来自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
谢谢&干杯, 格特
答案 0 :(得分:5)
如果您使用的是tcl 8.5或更高版本,则可以按如下方式使用,
exec {*}$cmd
否则,请使用以下代码
eval exec $cmd
让我们考虑一个例子
<强> example.tcl 强>
#usr/bin/tclsh
puts $argc
puts [ lindex $argv 0 ]
puts [ lindex $argv 1 ]
<强> 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 ]
答案 1 :(得分:1)
我很久没有使用过tcl,但我怀疑问题是你是将命令合并到一个变量中。
尝试执行
exec gphoto2 --set-config-value /main/imgsettings/iso=100
在tclsh中。这应该有用。
如果将整个命令合并为一个var,则试图找到该名称的可执行文件。