TCL中eval exec函数的差异

TCL中eval exec函数的差异,tcl,Tcl,我仍然对评估和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是多少?

我仍然对评估和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.哪一个好用

提前感谢。

从Tcl 8.5(当前为8.6.8)开始,扩展 运算符
{*}
(它会打断列表 添加到其组成词中),并且除了 在评估脚本和脚本片段时

对于较旧版本的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
的返回值中创建一个列表


参考资料:,

谢谢你。事实上,我只想如果计算机失败或拒绝访问ping,只需自动取消,不显示错误消息,包括windows消息,如拒绝访问消息。