从TCL变量调用unix程序

时间:2014-09-28 04:49:22

标签: 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}

给予:

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

谢谢&干杯, 格特

2 个答案:

答案 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,则试图找到该名称的可执行文件。