2

我试图在两个字符串上使用 tcl exec diff 在 tclsh 中产生相同的 diff 命令输出。

你能告诉我如何使用 tclsh exec diff 解决这个例子吗

使用 Bash

$ diff <(echo "Testword") <(echo "Testword2")
1c1
< Testword
---
> Testword2

TCL 失败

set str1 "Testword"
set str2 "Testword2"

第一次尝试

% exec diff <(echo "$string1") <(echo "$string2")
extra characters after close-quote

第二次尝试

% exec diff <(echo \"$string1\") <(echo \"$string2\")
couldn't read file "(echo": no such file or directory

第三次尝试

% exec diff \<(echo \"$string1\") \<(echo \"$string2\")
couldn't read file "(echo": no such file or directory

第四次尝试

% set command [concat /usr/bin/diff <(echo \\"$string1\\") <(echo \\"$string2\\")]
/usr/bin/diff <(echo \"Malli\") <(echo \"Malli1\")
% exec $command
couldn't execute "/usr/bin/diff <(echo \"Malli\") <(echo \"Malli1\")": no such file or directory.
4

1 回答 1

3

这有点棘手,因为您依赖于 bash 功能 - 转换<(some string)为看起来像文件的东西 - 但 Tcl 的 exec 不会调用 bash 或自行执行此转换。您可以通过从 Tcl 显式调用 bash 来使其工作:

% exec bash -c "diff <(echo '$string1') <(echo '$string2') || /bin/true"
1c1
< Testword
---
> Testword2
% 

注意

  • 此处的嵌套引用有效,因为单引号 ' 对于 bash 是特殊的,但对于 Tcl 不是
  • 添加 || /bin/true 是一种强制零(成功)退出代码的黑客 - 没有这个,您会收到错误消息“子进程异常退出”,因为当输入不同时 diff 返回非零退出状态。`
于 2016-03-07T11:14:43.260 回答