从Tcl脚本运行外部程序

从Tcl脚本运行外部程序,tcl,Tcl,我想根据二进制命令的结果导出一个变量。我的TCL脚本如下: set A "" exec sh -c "export A=\"`/usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery -noprompt | grep ^Device | wc -l`\"" puts $A if { $A == "1" } { set CUDA_VISIBLES_DEVICES 0 } else { set CUDA_VISIBL

我想根据二进制命令的结果导出一个变量。我的TCL脚本如下:

set A ""

exec sh -c "export A=\"`/usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery -noprompt | grep ^Device | wc -l`\""

puts $A

if { $A == "1" } {
    set CUDA_VISIBLES_DEVICES 0
} else {
    set CUDA_VISIBLES_DEVICES 1
}
有了这个脚本,当我执行
放入$A
时,我在终端中没有得到任何东西。。。所以在
if
命令中,我不知道我在评估什么。。。 我的“导出”只能返回1或0

对不起,我的TCL水平很差


谢谢。

我想你想要的是这样的:

set a [exec /usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery -noprompt | grep ^Device | wc -l]

您可以在TCL上下文中设置变量
a
,并将命令的返回值(即输出文本)分配给它。

问题在于您的exec命令在其自己的进程中运行,因此当您设置变量a时,a仅作为该进程生命周期内的shell变量存在。当进程退出时,A将消失

exec命令返回执行的命令的stdout。如果希望命令的结果位于Tcl变量中,则需要将该变量设置为exec的结果:

set A [exec ...]

有关exec命令的更多信息,请参阅

您无法从子进程更改父进程的环境变量。但我正在将和CUDA_VISIBLES_设备作为新的环境变量创建到TCL脚本中。。。我想,新只是变化的一种形式。但也许我误解了你的“出口”应该是什么意思。请澄清。在您的示例中,您执行了一个shell子流程,并设置了一个环境变量来保存管道的结果。但是,一旦您返回Tcl,shell子进程就终止了,它的所有变量都丢失了。Tcl中定义的变量与子进程中同名的变量之间没有神奇的联系。相反,您需要捕获管道的输出并在Tcl中解析它@bmk提供了一种实现这一点的方法。这是丹尼尔的必读书目。