我有一个问题:
auto_execok
命令无法按预期在Cygwin平台上运行。
它无法从您的PATH
环境变量中找到任何内容,如
info body auto_execok
"...
foreach dir [split $path {;}] {
"
默认情况下,;
认为是正确的分隔符,但Cygwin使用:
!
如何优雅地克服这个问题?
我不想更改PATH
变量,因为其他程序/脚本可以正确使用:
,因为它应该适用于Cygwin。
答案 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 ] "
}