问题标签 [io-redirection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - 我如何将进程的输入文本和输出文本捕获到文件中,就像从 shell 运行时一样
我需要通过运行它们并验证输出来测试一些程序,并将整个测试数据复制到报告中。通过整个测试数据,我的意思是程序的输出(stdout)和程序的输入(stdin)都需要在报告中。例如,假设我运行 python 进行一些计算。一个简单的会话可能如下所示:
在这里,我有我的输入和输出(我的计算的提示和结果)。
我的问题是,给定一个程序,可能还有一个包含该程序标准输入的文件,我怎样才能获得程序运行的所有文本数据,就好像我以交互方式运行它一样,就像上面的 python 会话一样?换句话说,在给定 python 程序和包含以下内容的文本文件(用于输入)的情况下,如何从 python 会话中获取上述文本:
我可以在 shell 中运行程序并复制输出,但这似乎不是一种干净、系统的方式。相反,我正在考虑编写另一个程序,它将给定程序作为参数以及文件名(从中读取输入)。第二个程序将从给定文件中读取,派生给定程序,将文本从文件转发到给定程序(通过管道),并读取给定程序的输出(也通过管道)。这样,这个中间程序可以读取输入和输出,并将它们写入另一个文件。
我预见的唯一问题是,由于流缓冲区以及其他原因,最终输出文件中输入和输出的放置将被关闭,我将无法获得预期的输出。那么,我的逻辑是否正确,如果是,我能否以我想要的方式获得输出?有没有更简单的方法来做到这一点,例如,已经存在这样的程序?
抱歉,解释太长了。感谢您的回复。
winapi - VC++ ReadFile 在读取已关闭的匿名管道时意外阻塞
我正在尝试创建一个运行任何 exe 命令的子进程,并通过匿名管道将其所有 stdio 和 stderr 重定向到我的父进程。但是,当我的父进程在子进程终止后尝试在匿名管道的 READ 端执行 ReadFile() 时,它只是阻塞而不是返回错误。
这是代码:
这就是我的代码正在做的事情。我的 _tmain() 创建一个子进程(我使用 VC++ cl.exe 命令作为测试)并将其 stdio 和 stderr 重定向到匿名管道的写入句柄。我的父进程从同一管道的读取句柄中读取。
这些由我的 _tmain() 打印,表明管道可以跨父子进程进行通信。如果我们在没有任何参数的命令行中键入 cl.exe,这些就是我们期望看到的。请注意 cl.exe 的特殊行为,前两行来自 cl.exe 的标准错误,最后一行来自标准输出。
现在关于问题,这一行:
在子 cl.exe 进程终止后的 _tmain() 块中。但是,我希望 ReadFile() 调用返回 ERROR_BROKEN_PIPE 错误状态并退出父循环而不是阻止 ReadFile() 调用。
为什么读取匿名管道时 ReadFile() 会阻塞?
stdout - 使用重定向的 StdOut 和 StdErr 创建子进程
我想创建一个程序,该程序可以为任意 exe 文件创建进程,同时捕获该 exe 文件的标准错误和标准输出,即重定向到我的程序。必须保留目标任意 exe 文件进程的输出序列。即,如果它将 10 个字符发送到 stdout,然后将 10 个字符发送到 stderr,然后将 10 个字符返回到 stdout,我的程序需要认识到孩子在 stderr 和 stdout 之间交替而不是简单地将 stderr 和 stdout 视为 2 个独立流的事实. 或者像这样:
标准输出 10 字节,标准错误 10 字节,标准输出 10 字节,标准错误 3 字节,......
我知道重定向 stdout 和 stderr 的标准方法是创建 2 个匿名管道并让创建的子进程继承这 2 个管道。但问题是匿名管道阻塞了 i/o。如果我在父级中使用 2 个线程,一个用于读取子级的 stdout,另一个用于读取子级的 stderr,我无法判断子级在 stdout 和 stderr 之间交替,即上面列出的序列信息丢失了。
编辑:
我正在为 cl.exe、lib.exe 和 link.exe 编写代理。与 Mozilla 开源项目 (NSPR) 捆绑在一起的构建系统使用一些非常独特的方式来构建源文件,以使其可跨多个平台移植并自动检测目标编译器的功能(即autoconf和配置脚本)。它在执行“make”时动态生成一些.h 文件和#define。它甚至调用一些 python 脚本来调用 cl.exe。
我不知道 Mozilla 构建系统在做什么,也不知道为什么它需要使用一些 python 脚本来调用 cl.exe(这显然分析了 cl.exe 命令的 stdout/stderr)。我不想花时间研究它。但我只知道它最后必须调用 cl.exe、lib.exe 和 link.exe,并且这些命令的接口必须是命令行参数、环境变量和 stdout/stderr。所以我需要编写一个代理 cl.exe,它调用真正的 cl.exe 并提供我自己的命令行参数,并尽可能透明地将任何 stderr 和 stdout 返回给调用者。
cl.exe 的特点是它可能在stderr 中返回错误信息,在stdout 中返回正常信息。我只想要一种透明的方式在真正的 cl.exe 和构建系统之间插入代理。
perl - 将系统命令的输出捕获到文本文件的最佳方法?
我正在尝试使用 Perl 的system
函数来捕获输出,以执行系统命令的输出并将其重定向到文件,但由于某种原因,我没有得到整个输出。
我正在使用以下方法:
这段代码有什么问题,或者是否有另一种方法可以做同样的事情?
windows - 无法在 Windows 命令提示符 (cmd.exe) 中重定向输出消息
我尝试在 Windows 命令提示符下运行以下命令。
我希望将所有输出abc.exe
定向到log.txt
,但它不起作用,因为log.txt
是空的。
但是,如果我只是执行abc.exe
,则输出将显示在 Windows 命令提示符中。
我不确定此应用程序使用的输出处理程序是什么(STDOUT 或 STDERR),但我想知道是否有一种方法可以捕获所有消息而不管处理程序如何。
linux - 将 svnadmin dump 的输出重定向到另一台服务器
我目前在可用磁盘空间不足的服务器上有一个 SVN 存储库。因此,我想将此 SVN 存储库迁移到新服务器。通常我会使用以下命令:
但是,如上所述,我的磁盘空间非常低,我想通过stdout
将svnadmin dump
进程流式传输到新服务器来存储新服务器的转储。最好的方法是什么?
shell - 重定向不起作用
我想把我的程序的输出放到一个文件中。我键入以下内容:
但是文件"log"中没有任何内容。我使用的是 Ubuntu 11.10,默认 shell 是 bash。
任何人都知道这个的原因以及我如何调试它?
c++ - C++ 检测输入重定向
考虑我们有一个小程序,它需要一些标准的 C 输入。
我想知道用户是否正在使用输入重定向,例如:
有没有办法在程序中检测这种输入重定向方式?
linux - 将linux中的汇编代码运行结果重定向到文本文件
我正在尝试编写一个 Python 脚本来测试我在汇编中编写的一些各种代码的输出与预期的输出。但是我很难将输出重定向到文件中。我写了以下内容:
然后我继续在控制台中执行以下操作:
将 10 输出到屏幕。但是,如果我输入
basic.txt 显示为一个空文件。我的总体目标是编写一个 shell 脚本,循环遍历每个程序集文件以编译和运行该文件,然后将该脚本的输出重定向到一个文件中。但是,在我可以让它与单个文件一起工作之前,我无法做到这一点。我想知道这与我对 printf 的调用有关吗?虽然我错觉 printf 写入 STDOUT。
提前致谢!
logging - 如何使 WebLogic 将所有“控制台”消息记录到文件中?
在 Eclipse 中,您可以在控制台中看到所有消息(的输出System.out.println
),但在 WebLogic 中,如何获取包含所有这些消息的文件?