如何使用 exec 从 tcl 为 运行 的 perl 脚本传递开关

How to pass switches for a perl script which is run from tcl using exec

我在我的 tcl 脚本中生成了一些变量,它们实际上用作 perl 脚本的开关。

我的开关是 -X-Y-Z,我将它们存储在一个变量中,cmd set cmd "-X -Y -Z"

我使用 exec 来 运行 tcl 中的 perl 脚本,如下所示:

exec ./script.pl $cmd

这会引发错误:"Error: Unknown option x -y -z"

然后我尝试了另一种方法:

exec ./script.pl -- $cmd

对于这种特殊情况,执行了 perl 脚本但没有开关,即开关没有被激活。

有什么办法可以解决吗?

set cmd "-X -Y -Z"

创建一个包含 -X -Y -Z 的字符串。当您使用 exec ./script.pl $cmd 调用 exec 命令时,您正在使用 -X -Y -Z 传递单个参数。你想要的是三个独立的参数。最好的方法是:

 exec ./script.pl {*}$cmd

{*} 运算符将列表扩展为其组成词。

这很有用。您可以使用类似于(示例)的代码构建参数列表:

set cmd {}
lappend cmd -X
if { $mytest eq "true" } {
   lappend cmd -Y 
}
lappend cmd -Z
if { $filename ne {} } {
  lappend cmd -f
  lappend cmd $filename
}
exec ./script.pl {*}$cmd

对于旧版本的 Tcl,必须使用 eval 命令:

eval exec ./script.pl $cmd

编辑:-- exec

的参数

exec-- 参数指定 exec 不再解析任何开关(选项)。这允许 exec 用于命令以 - 开头的情况。例如

 exec -- -myweirdcommand

参考文献:Tcl Syntax (#5); eval; exec