gpt4 book ai didi

linux - 在 tcl exec 中传递变量参数的正确方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 12:02:15 27 4
gpt4 key购买 nike

我在 Linux 中工作,我通常在 shell 中执行以下命令:

SomeCommand <Standard params> <params of type A> <params of type B> > Out.log

现在我想在 TCL 脚本中这样调用它:

set ParamsA "-some params of type A"
set ParamsB "-some params of type B"
set AllParams "-moreStandardParams $ParamsA $ParamsB"
exec SomeCommand $AllParams > Out.log

我在完成这项工作时遇到了一些困难,因为无论我尝试什么,我似乎都无法让 SomeCommand 看到所有参数。这样做的正确方法是什么?我显然是 TCL 的新手。 ""[] {} 和是否有其他封装参数的方法有什么区别?括号前后的空格有什么规则?

最佳答案

基本问题是 exec 将一组单词作为参数,它是只有一个通过。

我喜欢使用列表来构建命令行。然后对于实际的 exec,列表必须展开为单独的单词。列表有一个优点是当它们被转换为字符串时(例如 $mylist),规范化(字符串化、序列化)形式将始终转换回相同的列表。

set cmd mycommand
lappend cmd -param1 p1
lappend cmd -param2 p2
if { $someoption } {
lappend cmd -param3 p3
}
lappend cmd -debug

exec {*}$cmd > $outfile

如果您使用的是旧版本的 Tcl,则需要使用 eval 语句:

eval exec $cmd > $outfile

编辑:错过了你问题的另一半。

双引号括起字符串并允许插入转义字符以及变量和命令的替换:

 set cmd command
"here is [string toupper my] $cmd\r\n"

大括号类似于 algol 派生语言中的单引号。他们指定一个字符串。没有完成命令和变量替换。反斜杠插值未完成:

 {here is [string toupper my] $cmd\r\n}

括号指定第一个单词是一个命令并且应该被处理作为命令。

关于linux - 在 tcl exec 中传递变量参数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51950542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com