cygwin上的自动执行问题

cygwin上的自动执行问题,cygwin,tcl,Cygwin,Tcl,我有一个问题: auto_execok命令在Cygwin平台上无法正常工作。 它无法从PATH环境变量中找到任何内容,如下所示 info body auto_execok "... foreach dir [split $path {;}] { " 它默认认为是正确的分隔符,但Cygwin使用:! 如何优雅地克服这个问题? 我不想更改路径变量,因为其他程序/脚本可以正确地使用:,就像Cygwin应该使用的那样。您是否有一个正确的支持Cygwin的Tcl构建?正如您所发现的,直接构建Wi

我有一个问题:
auto_execok
命令在Cygwin平台上无法正常工作。 它无法从
PATH
环境变量中找到任何内容,如下所示

info body auto_execok
"...
    foreach dir [split $path {;}] {
"
它默认认为
是正确的分隔符,但Cygwin使用
! 如何优雅地克服这个问题?
我不想更改
路径
变量,因为其他程序/脚本可以正确地使用
,就像Cygwin应该使用的那样。

您是否有一个正确的支持Cygwin的Tcl构建?正如您所发现的,直接构建Windows会遇到问题,这正是因为Cygwin环境是Unix和Windows的混合体。(这是为什么我们不完全支持在Cygwin中做事的一个例子;它不时得到一些喜爱,但它不是一个主要的平台,因为它充满了微妙的复杂性。),这是一个几乎可以肯定的好问题,因为有一个社区可能能够帮助解决这类问题


还有,Tcl的补丁级别是什么?这很重要,因为随着时间的推移,支持级别肯定会有所不同。

我们可以混合使用
set ar[info args auto\u execok]
set bd[info body auto\u execok]
, 在body上使用
设置cygdir[exec cygpath-a$wdir]
eval proc auto_exeok{$ar}{$bd}
的一些regsub可以获得所需的结果


但是,目前,我还没有准备好完整的解决方案。

您可以将auto_execok的本机tcl版本包装成一个能够解析正确路径的版本。我们可以利用这样一个事实,即原始的auto_execok将找到cygpath.exe,并一次性告诉use当前脚本运行的是windows,它是为cygwin设置的。一旦知道了它,我们就可以用一个将使用cygpath.exe解析真实windows路径的程序来包装原始的auto_execok proc。我已经使用了try命令,所以这是针对8.5及以上版本的,但这可以使用catch编写,用于较低版本的tcl。另外,由于使用了subst命令,cygpath的路径被硬编码到新的auto_execok proc中,因此查找只发生一次。也只允许此代码运行一次。例如
在下面的代码运行之前

放入“[auto\u execok tar]”

给予 “/usr/bin/tar”

运行代码后,自动包装execok:

放入“[auto\u execok tar]”

给出(在我的机器上):

“C:/cygwin/bin/tar.EXE”


}

如果应该反映cygwin环境,可能会很有趣?patchLevel-8.4.1。但是我刚刚检查了8.5.9-与auto_execok相同的是硬编码的。>>您是否有一个正确的支持Cygwin的Tcl构建?--我在哪里可以买到呢?8.5.9是最近发布的(8.5.10只是在周五发布的)。Tcl检测到它所在平台的类型,并为该系统使用“正确”的
auto_execok
定义。标准Windows的规则与Unix完全不同,但我真的不知道Cygwin到底站在哪里;我从来没用过。(一定要访问c.l.t;知道这个的人更可能在那里看到它。)我有Cygwin附带的Tcl版本,它也有同样的问题。奇怪的是,我在cygwin下使用Tcl这么多年,从来没有注意到它。我想我不怎么使用autoexec功能。
if { [string length [ auto_execok cygpath ] ] } { 
set paths [ split $env(PATH) ";" ]
set cygexecpath "" 
foreach p $paths { 
    set c  [file join $p cygpath.exe ] 
    puts "checking for $c "
    if {[file exists $c ] } { 
        set cygexecpath [file join $p cygpath.exe ]
        break
    } 
}
if { $cygexecpath eq "" } { 
    puts "unable to find true path to [auto_execok cygpath.exe ]"
}
# rename original proc so we can use it in our wrapper proc 
rename ::auto_execok ::auto_execok_orig
uplevel #0 [subst -nocommands {proc auto_execok { path } {
    try {
        set path [auto_execok_orig \$path ] 
        if { \$path ne \"\" } {
            set path [string trim [exec $cygexecpath -w \$path ] ]
        }
    } on error { a b } {
        set path \"\" 
    } 
    return \$path
} } ] 
puts "[info body auto_execok ] "