TCL中eval exec函数的差异
我仍然对评估和exac场景感到困惑,如下所示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是多少?
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消息,如拒绝访问消息。