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

2024-05-13

我怎样才能“冲洗”stdout of the 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

我想我需要某种组合pipe "|" and tee和文件重定向。 似乎无法正确处理。


要立即获取输出,您需要将子命令作为管道打开。正确的(而不是quite显而易见,对此我们深表歉意)这样做的方法是使用以下结构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 很可能会写入其标准错误(如本问题所述,从 PHP exec() 函数读取 git Push 的输出 https://stackoverflow.com/questions/13389494/reading-output-of-git-push-from-php-exec-function)因此您可能需要将标准错误合并到捕获的标准输出中(如exec https://www.tcl.tk/man/tcl8.6/TclCmd/exec.htm手册页)。

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]]
# ...

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用管道的Python多进程非阻塞相互通信

    是否可以使用管道以非阻塞方式接收进程间通信 考虑以下代码 from multiprocessing import Process Pipe import time def f conn time sleep 3 conn send Done
  • 从 Bash 调用的 Expect 脚本的退出状态代码

    我制作了一个 Bash 脚本 它使用 Expect 脚本来自动进行 ssh 登录 该脚本连接到多个服务器并运行一些命令 bash 脚本会提示输入一次登录凭据 我想合并一个功能 其中如果第一个服务器登录失败 脚本将终止 以避免脚本检查下一个服
  • 如何以 OO 风格打开管道?

    我用新风格重写了旧代码 如下所示 old style open FD file new style fh IO File gt new file r 文件没问题 但我不知道如何打开管道 read from pipes open PIPE s
  • 无法在 Linux 中阻止从命名管道 (FIFO) 读取

    很奇怪 我似乎无法完成这项工作 这是我的架构 我有一个命名管道 它将在永远运行 root读取器进程和多个应用程序编写器进程 读者进程必须是blocking当作家们在nonblocking 因此 这就是我在阅读器进程中所做的 该进程将运行ro
  • 为什么我的 Java 代码执行 bash 命令不正确?

    我试图让我的 Java 程序与 Linux bash 交互 但出了问题 我有一个简单的可执行文件prog从中读取一个整数stdin并输出其平方 执行中 echo 5 prog 从 bash 本身打印正确答案25 in stdout但运行 i
  • 在Python中通过sys.stdout写入unicode字符串

    暂时假设一个人无法使用print 从而享受自动编码检测的好处 所以这给我们留下了sys stdout 然而 sys stdout太蠢了不做任何合理的编码 http bugs python org issue4947 现在人们阅读 Pytho
  • execlp 多个“程序”

    我想运行类似的东西 cat file tar base64 myprogram c base64 d tar zvt I use execlp运行该进程 当我尝试运行类似的东西时cat它有效 但如果我尝试运行base64 d tar zvt
  • 如何在 {expect} 脚本中创建“循环”语句?

    假设是 这是脚本 usr bin expect set a test 我想在这个脚本中创建一个循环 以便它可以打印值 a 前面有一个基于循环的数字 所以如果我想让它循环3次 最终产品将变成 1 test 2 test 3 test 您可以使
  • nodeJS exec 不适用于“cd”shell cmd

    var sys require sys exec require child process exec exec cd home ubuntu distro function err stdout stderr console log cd
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • powershell stdin 管道和重定向

    你好 我一直在制作一个小的跨平台脚 本 我可以将其卷曲并通过管道传输到bash和Powershell中 基本思想是服务器向解释器发送一个命令 然后它给出一个命令将所有输出重定向到标准输出 bash 中的一个例子是 some commands
  • (Tcl/Expect) 退出后清屏

    我想在退出我的 半 交互式期望脚本后清除屏幕 在本地计算机上 我可以在脚本中做到这一点吗 这是我尝试过的 但失败了 usr bin expect f set env TERM vt100 spawn ssh Y username domai
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • p 调用非托管 DLL 时获取标准输出?

    我有一个非托管 DLL 它将日志消息写入标准输出 我正在使用 WPF 应用程序中的 P 调用来调用此 DLL 并且我需要获取标准输出流日志 我尝试过 Console SetOut 但似乎只能捕获使用 Console Write 等写入的信息
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • Linux中使用管道进行进程间通信

    我已经编写了在 linux 中写入数字以进行管道传输的代码 如下所示 但显示错误 任何人都可以帮助我解决这个问题 基本上该程序的问题陈述如下 一个程序将打开一个管道 向管道写入一个数字 其他程序将打开同一管道 读取数字并打印它们 关闭两个管
  • fork 和 exec 之间的区别

    两者有什么区别fork and exec 指某东西的用途fork and exec它体现了 UNIX 的精神 它提供了一种非常简单的方法来启动新进程 The fork调用基本上复制了当前进程 在almost任何方式 并非所有内容都会被复制
  • 如何拥有在标准输出上更新的就地字符串

    我想输出到标准输出并让输出 覆盖 以前的输出 例如 如果我输出On 1 10 我想要下一个输出On 2 10覆盖On 1 10 我怎样才能做到这一点 stdout是一个流 io Writer 您无法修改已写入其中的内容 什么can更改的是该
  • Docker exec linux 终端创建别名

    我有一个正在运行且独立的容器 我想在附加到该容器之前创建一个命令别名 当我连接到容器并输入 alias bar foo 创建别名 并可以通过以下方式检查 alias command 但如果我想做同样的事情码头执行者命令即这样 docker
  • C 中的 '\0' 和 printf()

    在 C 入门课程中 我了解到在存储字符串时存储空字符 0在它的最后 但是如果我想打印一个字符串怎么办 printf hello 虽然我发现它并没有结束 0通过以下声明 printf d printf hello Output 5 但这似乎不

随机推荐