如何在 QNX 中捕获不发送到 stdout 或 stderr(直接发送到 tty)的输出?

如何在 QNX 中捕获不发送到 stdout 或 stderr(直接发送到 tty)的输出?

我有一个实用程序foo,我想从中 grep 输出、重定向或执行所有正常的文本操作。可惜!看看它有什么作用...

$ foo
bar
$ foo > /dev/null
bar
$ foo 2> /dev/null
bar
$ foo | grep abc
bar
$ foo 2| grep abc
bar

显然输出既不是stdout也不是stderr。也许foo直接访问 tty 而不是 stdout。有一个答案这里这提供了一种使用的解决方法script -c。但唉!

$ script -c foo > /dev/null
script: illegal option -- c
usage: script [-a] [file]

也许我的script实用程序不是完整版本。操作系统是QNX。

对于我们这些无法使用script -c解决方法的人来说,我们如何轻松捕获输出?有没有办法重定向 tty 文件本身,如果这有意义的话?

是否可以做类似的事情foo (/dev/ttyp0)| grep abc?这可能不会完全如图所示,但有没有办法做类似的事情?要求首先重定向文件(如果可能的话)的答案很好,所以类似的事情/dev/ttyp0 please go to /dev/null ; foo是可以的。

最终,我希望能够将输出传输到文件foogrep/或将foo输出重定向到文件。

答案1

是的,foo应用程序可能直接写入 TTY。

这是一个执行相同操作的脚本:

#!/bin/sh
echo 'bar' >$(tty)

由于您的script实用程序不能foo直接用于执行(只能通过实用程序启动的交互式 shell),因此您必须找到另一种方法来分配新的 TTY 来执行命令。

其中一种方法是使用ssh

ssh -t localhost "$PWD/foo" >output.log

这将(ab)使用ssh连接到localhost,强制使用 分配 TTY -t,并运行foo位于当前目录中的应用程序。的输出foo,包括写入 TTY、标准输出和标准错误的所有内容,将从 的标准输出返回给您ssh,然后您可以将其重定向到您想要的任何位置。

答案2

好的,我用脚本(在 BSD 盒子上)捕获长时间运行的作业的输出或构建输出。是的,我相信你会遇到什么。例如,从手册页:

-a      Append the output to file or typescript, retaining the prior contents.

看起来熟悉? :)

该选项-F pipe可能会为您提供一个可能的解决方案。但最后,从你的问题来看,我不太确定脚本实际上就是您正在寻找的。

查看我链接到的手册页。

华泰

答案3

如果您的程序忽略该-i选项,您可以直接运行它

SHELL=/path/to/your/program script /dev/null > output 

如果它对这个选项感到困惑-i,你可以为它创建一个包装器。

$ cat wrapper
#! /bin/sh
exec /path/to/your/program
$ chmod 755 wrapper
$ SHELL=./wrapper script /dev/null > output

相关内容