0

我有这个打开:

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

在哪里$config(cmd,sh)cmd /c我正在尝试在 $cmd 中传递文件名(可能还有 echo 等命令)。如果文件名中没有空格,即 :
cmd 就万事大吉echo /filename
了。带空格,即:
cmdecho "/file name" 似乎传递的是:
\"file name\"
当我在 Linux 上尝试这个时,我得到"file name"(没有反斜杠)。我试过用 替换文件名中的空格"\ ",但是目标得到两个文件名,即空格用于分解文件名。

我开始认为我在 Tcl 的 Windows 端口中发现了一个错误......

4

1 回答 1

3

呃,看起来很复杂!要将这种东西传递到管道创建代码中,您需要使用正确的配方:

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

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

于 2013-04-17T05:04:59.430 回答