tcl open pipe似乎错误地处理了参数中的空格

时间:2013-04-16 23:29:03

标签: tcl

我打开了这个:

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端口发现了一个错误...

1 个答案:

答案 0 :(得分:3)

唉,这看起来很复杂!要将此类事物传递给管道创建代码,您需要使用完全正确的配方:

set r [catch {open |[list {*}$config(cmd,sh) $cmd 2>@1] r} fid]

也就是说,在构建管道时始终使用带有|[list ...]的表单,因为文档说这是管道开启器所寻找的。 (这是Tcl中唯一的命令。) 当然,在这种情况下使用(8.5+){*}语法也要简单得多,因为它显然做正确的事。