TCL中eval exec函数的差异

时间:2018-01-30 17:14:02

标签: tcl

我仍然对eval和exac场景感到困惑,如下所示;

1st scenario: exec ping "stackoverflow.com" -n 1
2nd scenario: eval exec [list ping //nologo "stackoverflow.com" -n 1]
3rd scenario: [list eval exec [list ping //nologo "stackoverflow.com" -n 1]]

问题如下; 1.上面的差异树? 2.什么是1号值? 3.哪一个好用呢?

提前致谢。

1 个答案:

答案 0 :(得分:1)

从Tcl 8.5开始(当前为8.6.8),扩展 operator {*}(打破列表 添加了它的组成部分),除了以外很少需要eval 在评估脚本和脚本片段时。

对于旧版本的Tcl,使用eval代替扩展运算符。

使用扩展运算符,#2将成为:

exec {*}[list ping /nologo "stackoverflow.com" -n 1]

你的#1没什么问题,但有几个常见的 使用exec的模式,其中#2更有用。

a)保存要执行的命令允许您重复使用它进行重试    或者用于调试。

b)命令可以动态方式构建。

foreach {host} [list stackoverflow.com stack_typo_exchange.com superuser.com] {
  set cmd [list ping /nologo $host -n 1]
  try {
    exec {*}$cmd
  } on error {err res} {
    puts "ERROR: exec: $cmd"
    puts "       result: $res"
  }         
}

旧版本的Tcl将使用catch命令:

if { [catch {eval exec $cmd}] } {
   puts "ERROR: exec: $cmd"
}

您的#3(通常)代码不正确。它正在从eval exec返回值中创建一个列表。

参考文献:Tcl / argument expansiontrycatchexec