当我在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
是好的。