当我在终端中执行命令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
的输出。这是什么原因?
任何人都可以帮助我吗?
答案 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
是正常的。