在tcl中执行linux命令

当我在terminal执行命令openssl rand -base64 12时,它打印输出:

 mFpVuBreI0dPENLF 

我有以下的tcl脚本,我用exec来调用linux:

 for {set kb 0} {$kb<5} {incr kb} { exec openssl rand -base64 12 puts "end" } 

当我运行上面的脚本时,它将打印四次“end”这个单词,但不打印openssl rand -base64 12的输出。 这是什么原因?

谁能帮我?

捕获执行的子进程的输出并打印。 例如:

 for {set n 0} {$n < 4} {incr n} { set r [exec openssl rand -base64 12] puts [format {%d %s} $n $r] } 

测试这个:

 $ tclsh8.5 z.tcl 0 GG6ppnaPgJoTPxlC 1 xLHDiDBBQ6cxxvmg 2 wGnqqegconlwu3YV 3 QRM0IsXzw4rk3r+j 

原因是子流程的标准输出已经被记录下来 :

如果标准输出没有被重定向,则exec命令返回管道中最后一个命令的标准输出

所以openssl的stdout不再连接到终端。 取而代之的是Tcl读取它,并将任何写入到变量中的东西,除非您使用手册页中给出的重定向选项之一。 对于使用open产生大量输出的进程可以是一个更好的选择,然后可以分段读取输出,但是对于这个例子, exec是好的。