Вы можете обернуть собственную версию tcl для auto_execok той, которая разрешит правильный путь.Мы можем использовать тот факт, что оригинальный auto_execok найдет cygpath.exe и одним махом скажет использовать, что текущий скрипт работает под управлением windows, и он настроен для cygwin.Как только это станет известно, мы можем обернуть оригинальный процесс auto_execok тем, который будет использовать cygpath.exe для определения истинного пути Windows.Я использовал команду try, так что это для 8.5 и выше, но это может быть написано с использованием catch для более низких версий tcl.Кроме того, поскольку команда subst используется, путь к cygpath жестко запрограммирован в новом процессе auto_execok, поэтому поиск происходит только один раз.Также разрешите запускать этот код только один раз.Таким образом, в качестве примера
перед выполнением приведенного ниже кода
puts "[ auto_execok tar ]"
выдает "/ usr / bin / tar"
после выполнения кода 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 ] "
}