在TCL中处理之前如何防止替换?

在TCL中处理之前如何防止替换?,tcl,command-substitution,Tcl,Command Substitution,我正在调用一个像这样的TCL过程- ::f::abstract -procname my_proc -args "-arg1 $a -arg2 $b" "ping -c 1 10.1.1.$ip" 现在这里,$a本身就是这样的- ::f::abstract -procname my_proc -args "-arg1 $a -arg2 $b" "ping -c 1 10.1.1.$ip" 当我试着运行它时,$a被展开,它变成- -args "-arg1 ping -c 1 10.1.1.

我正在调用一个像这样的TCL过程-

::f::abstract -procname my_proc -args "-arg1 $a -arg2 $b"
"ping -c 1 10.1.1.$ip"
现在这里,
$a
本身就是这样的-

::f::abstract -procname my_proc -args "-arg1 $a -arg2 $b"
"ping -c 1 10.1.1.$ip"
当我试着运行它时,
$a
被展开,它变成-

-args "-arg1 ping -c 1 10.1.1.27 -arg2 a2"
这给出了一个错误,因为现在我们似乎有额外的参数,如-c

我想要的是把
$a
作为一个整体,然后在过程内部展开它

我该怎么做

我不能使用
{}
括号,因为我需要变量替换。我无法删除引号,因为外部引号包含
args

如何

::f::abstract -procname my_proc -args [list -arg1 $a -arg2 $b]
它允许替换,但保留命令行的列表结构。也就是说,您在每个级别上仍然有相同数量的参数。

如何

::f::abstract -procname my_proc -args [list -arg1 $a -arg2 $b]

它允许替换,但保留命令行的列表结构。也就是说,你在每一个层面上仍然有相同数量的论点。

欢迎引用恐怖

如果在过程中正确展开,请将其视为正确的列表:

::f::abstract -procname my_proc -args [list -arg1 $a -arg2 $b]
这会像您期望的那样传递到您的进程:四件事:

  • 字符串
    -arg1
  • 列表/脚本
    ping-c110.1.1.$ip
  • 字符串
    -arg2
在proc中,您必须再次
eval
arg1的“a”值,正如您所期望的那样(我希望,在您的结构中会给出多个求值)

proc。。。args{
数组集选项
数组集选项$args
设置[uplevel 1$options(-arg1)]
...
#$a现在有一个有用的值。。。
}

欢迎引用恐怖故事

如果在过程中正确展开,请将其视为正确的列表:

::f::abstract -procname my_proc -args [list -arg1 $a -arg2 $b]
这会像您期望的那样传递到您的进程:四件事:

  • 字符串
    -arg1
  • 列表/脚本
    ping-c110.1.1.$ip
  • 字符串
    -arg2
在proc中,您必须再次
eval
arg1的“a”值,正如您所期望的那样(我希望,在您的结构中会给出多个求值)

proc。。。args{
数组集选项
数组集选项$args
设置[uplevel 1$options(-arg1)]
...
#$a现在有一个有用的值。。。
}

扩展语法对这类事情很有帮助。
{*}
扩展语法对这类事情很有帮助。