代码之家  ›  专栏  ›  技术社区  ›  Davide

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

  •  3
  • Davide  · 技术社区  · 14 年前

    这是未重定向的输出(如果您不知道 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. 他们为什么要做这么奇怪的事?

    也见 this 相关问题。

    编辑:有人在评论中问过,所以有些细节。这在AIX5.3上是64位的。我有几乎完全可用的python 2.6.5。我有GCC 4.1.1和GCC 4.5.1,但链接它们的库不多(包含答案中提到的脚本版本的UtilLinuxNG库无法为getopt部分编译)。我还有几个版本的IBMXL编译器XLC。 一开始我没有指定的原因是我希望使用一些shell技巧,可能是使用exec,而不是外部程序。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Community Keith    7 年前

    试试这个:

    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 .

        2
  •  2
  •   Davide    14 年前

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

    我的解决方案是,由于我不能使用任何其他推荐的工具(例如,script,expect),所以使用以下python mini包装器:

    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
    
        3
  •  0
  •   Steve Emmerson    14 年前

    看起来像 module 正在写信给 /dev/tty ,它始终是与进程关联的控制台。如果是这样的话,我想你什么都做不了。通常,这样做是为了确保用户看到消息(假设程序是以交互方式调用的)。