我有一个实用程序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
是可以的。
最终,我希望能够将输出传输到文件foo
和grep
/或将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
答案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