在tcl中执行linux命令

时间:2014-02-28 10:51:41

标签: linux terminal tcl

当我在终端中执行命令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的输出。这是什么原因?

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

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

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

原因是已捕获子进程的标准输出as documented

  

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

所以openssl的stdout不再连接到终端。相反,除非您使用手册页中给出的重定向选项之一,否则Tcl会读取并将任何内容写入变量。对于使用open生成大量输出的进程可能是更好的选项,因为您可以读取片段中的输出,但是对于此示例exec是正常的。