tcl:希望并希望<source />区别

时间:2014-01-14 16:43:18

标签: tcl

我是Tcl / tk的新手,对“愿望”找到命令的方式感到困惑。

我可以在终端中以相同的方式运行其他程序,当交互式运行时(给定一个命令,希望从ENV运行来自PATH目录的可执行文件),但是当像wish <source>那样运行时,调用其他可执行文件得到了cmd未找到错误,我必须使用[exec "<executable_name>"]来执行此操作,我已阅读www.tcl.tk上的文档,只发现在wish <source>运行时,没有.wishrc自动加载(I已检查我的磁盘上没有这样的文件)。

任何人都知道为什么不能直接从脚本源文件调用PATH中的可执行文件?

2 个答案:

答案 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脚本中。

file / usr / bin / wish

/ usr / bin / wish:POSIX shell脚本文本可执行文件