Auto_execok проблема на Cygwin - PullRequest
1 голос
/ 26 июня 2011

У меня проблема: команда auto_execok не работает на платформе Cygwin, как ожидалось.Он не может найти ничего из вашей PATH переменной среды, так как

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

По умолчанию он считает, что ; является правым разделителем, но Cygwin использует :!Как элегантно преодолеть эту проблему?Я не хочу менять PATH переменную, так как другие программы / скрипты могут правильно использовать :, как это должно быть для Cygwin.

Ответы [ 3 ]

0 голосов
/ 14 июля 2011

Мы можем использовать смесь set ar [info args auto_execok], set bd [info body auto_execok], некоторую regsub на теле с set cygdir [exec cygpath -a $wdir] и eval proc auto_exeok {$ar} {$bd} для получения необходимого результата.

Однако на данный момент я нееще готов с полным решением.

0 голосов
/ 07 января 2015

Вы можете обернуть собственную версию 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 ] "

}

0 голосов
/ 26 июня 2011

У вас есть правильная сборка Tcl с поддержкой Cygwin? Как вы обнаружили, простая сборка Windows сталкивается с проблемами именно потому, что среда Cygwin представляет собой своего рода смесь между Unix и Windows. (Это пример того, почему мы не полностью поддерживаем действия в Cygwin; он время от времени получает некоторую любовь, но это не основная платформа, потому что она полностью сложна.) Тем не менее, это своего рода вопрос о котором почти наверняка лучше спросить на comp.lang.tcl , поскольку в нем есть сообщество, которое может помочь с подобными вещами.

Кроме того, что это за уровень Tcl? Это важно, потому что уровень поддержки наверняка менялся с течением времени ...

...