我是Tcl / tk的新手,对“愿望”找到命令的方式感到困惑。
我可以在终端中以相同的方式运行其他程序,当交互式运行时(给定一个命令,希望从ENV运行来自PATH目录的可执行文件),但是当像wish <source>
那样运行时,调用其他可执行文件得到了cmd未找到错误,我必须使用[exec "<executable_name>"]
来执行此操作,我已阅读www.tcl.tk上的文档,只发现在wish <source>
运行时,没有.wishrc自动加载(I已检查我的磁盘上没有这样的文件)。
任何人都知道为什么不能直接从脚本源文件调用PATH中的可执行文件?
答案 0 :(得分:2)
如果Tcl找不到命令,[它执行unknown
](使用原始命令作为参数)并使用其中的结果作为缺失命令的结果。
如果Tcl以交互模式运行(tcl_interactive
为1,命令在0级执行且当前没有脚本执行),它将尝试进一步的步骤来查找可能执行的内容:
if {([info level] == 1) && ([info script] eq "") && [info exists tcl_interactive] && $tcl_interactive} {
if {![info exists auto_noexec]} {
set new [auto_execok $name]
if {$new ne ""} {
set redir ""
if {[namespace which -command console] eq ""} {
set redir ">&@stdout <@stdin"
}
uplevel 1 [list ::catch [concat exec $redir $new [lrange $args 1 end]] ::tcl::UnknownResult ::tcl::UnknownOptions]
dict incr ::tcl::UnknownOptions -level
return -options $::tcl::UnknownOptions $::tcl::UnknownResult
}
}
if {$name eq "!!"} {
set newcmd [history event]
} elseif {[regexp {^!(.+)$} $name -> event]} {
set newcmd [history event $event]
} elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name -> old new]} {
set newcmd [history event -1]
catch {regsub -all -- $old $newcmd $new newcmd}
}
if {[info exists newcmd]} {
tclLog $newcmd
history change $newcmd 0
uplevel 1 [list ::catch $newcmd ::tcl::UnknownResult ::tcl::UnknownOptions]
dict incr ::tcl::UnknownOptions -level
return -options $::tcl::UnknownOptions $::tcl::UnknownResult
}
set ret [catch {set candidates [info commands $name*]} msg]
if {$name eq "::"} {
set name ""
}
if {$ret != 0} {
dict append opts -errorinfo "\n (expanding command prefix \"$name\" in unknown)"
return -options $opts $msg
}
# Filter out bogus matches when $name contained
# a glob-special char [Bug 946952]
if {$name eq ""} {
# Handle empty $name separately due to strangeness
# in [string first] (See RFE 1243354)
set cmds $candidates
} else {
set cmds [list]
foreach x $candidates {
if {[string first $name $x] == 0} {
lappend cmds $x
}
}
}
if {[llength $cmds] == 1} {
uplevel 1 [list ::catch [lreplace $args 0 0 [lindex $cmds 0]] ::tcl::UnknownResult ::tcl::UnknownOptions]
dict incr ::tcl::UnknownOptions -level
return -options $::tcl::UnknownOptions $::tcl::UnknownResult
}
if {[llength $cmds]} {
return -code error "ambiguous command name \"$name\": [lsort $cmds]"
}
}
首先检查是否有任何具有该名称的命令可以执行 然后它检查是否有任何历史替换。 最后,它会检查此命令是否有唯一的前缀。
答案 1 :(得分:0)
您可以尝试将路径添加到/ usr / bin / wish脚本中。
/ usr / bin / wish:POSIX shell脚本文本可执行文件