我仍然对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.哪一个好用呢?
提前致谢。
答案 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
返回值中创建一个列表。