如何重定向写入tty的程序?

时间:2010-10-29 21:36:18

标签: bash redirect stderr pty

这是未重定向的输出(如果您不知道module是什么,它并不重要):

$ module help null

----------- Module Specific Help for 'null' -----------------------

        This module does absolutely nothing.
        It's meant simply as a place holder in your
        dot file initialization.

        Version 3.2.6

假设我想将其重定向到文件....

$ module help null > aaa.txt 

----------- Module Specific Help for 'null' -----------------------

        This module does absolutely nothing.
        It's meant simply as a place holder in your
        dot file initialization.

        Version 3.2.6

$ cat aaa.txt
$

好吧,它必须在stderr

$ module help null 2> aaa.txt 
        This module does absolutely nothing.
        It's meant simply as a place holder in your
        dot file initialization.

        Version 3.2.6

$ cat aaa.txt 

----------- Module Specific Help for 'null' -----------------------
$

喂!它正在重置我的重定向。这真的很烦人,我有两个问题:

  1. 我如何实现我想要的,即将所有内容重定向到我的文件
  2. 他们为什么这么奇怪?
  3. 另见this相关问题。

    编辑:有人在评论中提问,所以有些细节。这是在AIX 5.3上的64位。我有几乎完全可用的python 2.6.5。我有gcc 4.1.1和gcc 4.5.1但没有很多库可以链接它们(util-linux-ng库,其中包含答案中提到的脚本版本无法为getopt部分编译)。我还有几个版本的IBM XL编译器xlc。 我之前没有说明的原因是我希望有一些shell技巧,可能是exec,而不是外部程序。

3 个答案:

答案 0 :(得分:6)

试试这个:

script -q -c 'module help null' /dev/null > aaa.txt

这适用于使用

的shell脚本(非交互式)
$ script --version
script (util-linux-ng 2.16)

您也可以使用expect

另见:Catching a direct redirect to /dev/tty

答案 1 :(得分:2)

我首先回答第二个问题:作为一个设计选择,模块是一个eval,他们采用(有问题的)选择使用stderr / tty而不是stdout / stderr来保持他们的设计更容易。请参阅here

我的解决方案,因为我无法使用任何其他推荐的工具(例如脚本,期望)是以下python迷你包装器:

import pty, os

pid, fd = pty.fork()
if pid == 0: # In the child process execute another command
    os.execv('./my-progr', [''])
    print "Execv never returns :-)"
else:
    while True:
        try:
            print os.read(fd,65536),
        except OSError:
            break

答案 2 :(得分:0)

看起来module正在写入/dev/tty,它始终是与流程关联的控制台。如果是这样,那么我认为你无能为力。通常,这样做是为了保证该人看到该消息(假设该程序是以交互方式调用的)。