我打开了这个:
set r [catch {open "|[concat $config(cmd,sh) [list $cmd 2>@1]]" r} fid]
其中$config(cmd,sh)
是cmd /c
,我试图在$ cmd中传递文件名(可能还有一个命令,如echo)。如果文件名中没有空格,即:
cmd是echo /filename
一切都很好。有空间,即:
cmd是echo "/file name"
看似通过的是:
\"file name\"
。
当我在Linux上尝试这个时,我得到"file name"
(没有反斜杠)。我尝试用"\ "
替换文件名中的空格,但是目标获取了两个文件名,即该空格用于分解文件名。
我开始认为我在Tcl的Windows端口发现了一个错误...
答案 0 :(得分:3)
set r [catch {open |[list {*}$config(cmd,sh) $cmd 2>@1] r} fid]
也就是说,在构建管道时始终使用带有|[list ...]
的表单,因为文档说这是管道开启器所寻找的。 (这是Tcl中唯一的命令。)
当然,在这种情况下使用(8.5+){*}
语法也要简单得多,因为它显然做做正确的事。