Avn*_*arr 1 stdout pipe tcl exec
如何在不“等待”结果 exec 返回的情况stdout下将exec命令的“刷新”到我的脚本中stdout?
例如,在以下脚本中,我希望git clone输出立即出现在我的脚本上下文中:
#!/usr/bin/tclsh
# git outputs progress of the clone download but it isn't visible in this script's context. How can I flush it?
exec git clone /path/to/some/repo.git
Run Code Online (Sandbox Code Playgroud)
我猜我需要某种pipe "|"和tee和文件重定向的组合。似乎无法正确理解。
要立即获得输出,您需要将子命令作为管道打开。正确的(不是很明显,我们为此道歉)方法是使用以下结构open |[list …]:
set mypipeline [open |[list git clone /path/to/some/repo.git]]
# Now to read it by line; we'll just print it out with a line number to show off
set linenum 0
while {[gets $mypipeline line] >= 0} {
puts "Line [incr linenum]: $line"
}
# Close the pipe now we're at EOF
close $mypipeline
Run Code Online (Sandbox Code Playgroud)
但是请注意,某些程序(我不知道是否git是其中之一)在管道中运行时会改变它们的行为,缓冲它们的输出直到它们具有完整的缓冲区值。(当输出不是到终端时,这是默认情况下 C 运行时工作方式的一部分。)如果这是一个问题,您将不得不使用 Expect 运行。这是一个足够大的主题,您应该寻找(并在必要时询问)一个单独的问题;唉,这是复杂性的一个相当大的变化。
另请注意,git 可能会写入其标准错误(如本问题中所述,从 PHP exec() 函数读取 git push 的输出),因此您可能需要将标准错误合并到捕获的标准输出中(如在exec手册页)。
set output [exec git clone /path/to/some/repo.git 2>@1]
Run Code Online (Sandbox Code Playgroud)
set mypipeline [open |[list git clone /path/to/some/repo.git 2>@1]]
# ...
Run Code Online (Sandbox Code Playgroud)
也可以做读/写管道,但更复杂。
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |