gpt4 book ai didi

pipe - TCL 脚本 - exec 将文本刷新到我的标准输出

转载 作者:行者123 更新时间:2023-12-01 22:25:35 24 4
gpt4 key购买 nike

如何将 exec 命令的 stdout“刷新”到我的脚本的 stdout 而无需“等待”生成的 exec 返回?

例如在下面的脚本中,我希望 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

我猜我需要某种 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

但是请注意,某些程序(我不知道 git 是不是一个)在管道中运行时会改变它们的行为,缓冲它们的输出,直到它们有一个完整的缓冲区值。 (当输出不在终端时,这是 C 运行时默认工作方式的一部分。)如果这是一个问题,您将不得不使用 Expect 运行。这是一个足够大的话题,您应该寻找(并在必要时提出)一个单独的问题;唉,这在复杂性上是一个很大的变化。

另请注意,git 可能会写入其标准错误(如本问题中所述,Reading output of git push from PHP exec() function),因此您可能需要将标准错误合并到捕获的标准输出中(如 exec 手册页中的简要记录) ).

set output [exec git clone /path/to/some/repo.git 2>@1]
set mypipeline [open |[list git clone /path/to/some/repo.git 2>@1]]
# ...

也可以做读/写管道,但更复杂。

关于pipe - TCL 脚本 - exec 将文本刷新到我的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35397884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com