2

2 つの文字列に対して tcl exec diff を使用して、tclsh で diff コマンドの同じ出力を生成しようとしています。

tclsh exec diff を使用してこの例を解決する方法を教えてください。

バッシュの操作

$ 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

2 回目の試行

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

3 回目の試行

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

4 回目の試行

% 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 に答える