问题标签 [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.

0 投票
2 回答
304 浏览

linux - 我如何将进程的输入文本和输出文本捕获到文件中,就像从 shell 运行时一样

我需要通过运行它们并验证输出来测试一些程序,并将整个测试数据复制到报告中。通过整个测试数据,我的意思是程序的输出(stdout)和程序的输入(stdin)都需要在报告中。例如,假设我运行 python 进行一些计算。一个简单的会话可能如下所示:

在这里,我有我的输入和输出(我的计算的提示和结果)。

我的问题是,给定一个程序,可能还有一个包含该程序标准输入的文件,我怎样才能获得程序运行的所有文本数据,就好像我以交互方式运行它一样,就像上面的 python 会话一样?换句话说,在给定 python 程序和包含以下内容的文本文件(用于输入)的情况下,如何从 python 会话中获取上述文本:

我可以在 shell 中运行程序并复制输出,但这似乎不是一种干净、系统的方式。相反,我正在考虑编写另一个程序,它将给定程序作为参数以及文件名(从中读取输入)。第二个程序将从给定文件中读取,派生给定程序,将文本从文件转发到给定程序(通过管道),并读取给定程序的输出(也通过管道)。这样,这个中间程序可以读取输入和输出,并将它们写入另一个文件。

我预见的唯一问题是,由于流缓冲区以及其他原因,最终输出文件中输入和输出的放置将被关闭,我将无法获得预期的输出。那么,我的逻辑是否正确,如果是,我能否以我想要的方式获得输出?有没有更简单的方法来做到这一点,例如,已经存在这样的程序?

抱歉,解释太长了。感谢您的回复。

0 投票
1 回答
1811 浏览

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() 会阻塞?

0 投票
1 回答
660 浏览

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 和构建系统之间插入代理。

0 投票
6 回答
40468 浏览

perl - 将系统命令的输出捕获到文本文件的最佳方法?

我正在尝试使用 Perl 的system函数来捕获输出,以执行系统命令的输出并将其重定向到文件,但由于某种原因,我没有得到整个输出。

我正在使用以下方法:

这段代码有什么问题,或者是否有另一种方法可以做同样的事情?

0 投票
2 回答
3985 浏览

windows - 无法在 Windows 命令提示符 (cmd.exe) 中重定向输出消息

我尝试在 Windows 命令提示符下运行以下命令。

我希望将所有输​​出abc.exe定向到log.txt,但它不起作用,因为log.txt是空的。

但是,如果我只是执行abc.exe,则输出将显示在 Windows 命令提示符中。

我不确定此应用程序使用的输出处理程序是什么(STDOUT 或 STDERR),但我想知道是否有一种方法可以捕获所有消息而不管处理程序如何。

0 投票
1 回答
925 浏览

linux - 将 svnadmin dump 的输出重定向到另一台服务器

我目前在可用磁盘空间不足的服务器上有一个 SVN 存储库。因此,我想将此 SVN 存储库迁移到新服务器。通常我会使用以下命令:

但是,如上所述,我的磁盘空间非常低,我想通过stdoutsvnadmin dump进程流式传输到新服务器来存储新服务器的转储。最好的方法是什么?

0 投票
1 回答
1100 浏览

shell - 重定向不起作用

我想把我的程序的输出放到一个文件中。我键入以下内容:

但是文件"log"中没有任何内容。我使用的是 Ubuntu 11.10,默认 shell 是 bash。

任何人都知道这个的原因以及我如何调试它?

0 投票
4 回答
3350 浏览

c++ - C++ 检测输入重定向

可能重复:
检测标准输入是否是 C/C++/Qt 中的终端或管道?

考虑我们有一个小程序,它需要一些标准的 C 输入。

我想知道用户是否正在使用输入重定向,例如:

有没有办法在程序中检测这种输入重定向方式?

0 投票
2 回答
959 浏览

linux - 将linux中的汇编代码运行结果重定向到文本文件

我正在尝试编写一个 Python 脚本来测试我在汇编中编写的一些各种代码的输出与预期的输出。但是我很难将输出重定向到文件中。我写了以下内容:

然后我继续在控制台中执行以下操作:

将 10 输出到屏幕。但是,如果我输入

basic.txt 显示为一个空文件。我的总体目标是编写一个 shell 脚本,循环遍历每个程序集文件以编译和运行该文件,然后将该脚本的输出重定向到一个文件中。但是,在我可以让它与单个文件一起工作之前,我无法做到这一点。我想知道这与我对 printf 的调用有关吗?虽然我错觉 printf 写入 STDOUT。

提前致谢!

0 投票
1 回答
20076 浏览

logging - 如何使 WebLogic 将所有“控制台”消息记录到文件中?

在 Eclipse 中,您可以在控制台中看到所有消息(的输出System.out.println),但在 WebLogic 中,如何获取包含所有这些消息的文件?