cygwin上的Auto_execok问题

时间:2011-06-25 22:03:29

标签: cygwin tcl

我有一个问题: auto_execok命令无法按预期在Cygwin平台上运行。 它无法从您的PATH环境变量中找到任何内容,如

info body auto_execok
"...
    foreach dir [split $path {;}] {
"

默认情况下,;认为是正确的分隔符,但Cygwin使用:! 如何优雅地克服这个问题? 我不想更改PATH变量,因为其他程序/脚本可以正确使用:,因为它应该适用于Cygwin。

3 个答案:

答案 0 :(得分:0)

你有一个适当的Cygwin感知的Tcl版本吗?正如您所发现的那样,直接的Windows构建会遇到问题,因为Cygwin环境是Unix和Windows之间的混合体。 (这是为什么我们不完全支持在Cygwin中做事的一个例子;它不时得到一些爱,但它不是一个主要的平台,因为它完全是复杂的。)也就是说,这就是那种问题在comp.lang.tcl询问几乎肯定更好,因为有一个社区可能能够帮助解决这类问题。

此外,这是什么补丁级别的Tcl?这很重要,因为支持水平肯定会随着时间而变化......

答案 1 :(得分:0)

我们可以混合使用set ar [info args auto_execok]set bd [info body auto_execok], 使用set cygdir [exec cygpath -a $wdir]eval proc auto_exeok {$ar} {$bd}对身体进行一些regsub以获得所需的结果。

但是,目前我尚未准备好完整的解决方案。

答案 2 :(得分:0)

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

puts "[ auto_execok tar ]"

给出  "在/ usr /斌/焦油"

代码运行后

auto_execok被包装:

puts "[ auto_execok tar ]"

给(在我的机器上):

" C:/cygwin/bin/tar.EXE"

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 ] "

}