Как перенаправить программу, которая пишет в tty? - PullRequest
3 голосов
/ 30 октября 2010

Это перенаправленный вывод (если вы не знаете, что такое 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. Почему они делают такие странные вещи?

См. Также этот связанный вопрос.

РЕДАКТИРОВАТЬ: кто-то спросил в комментарии, поэтому некоторые детали. Это в AIX 5.3 в 64 битах. У меня Python 2.6.5 почти полностью доступен. У меня есть и gcc 4.1.1, и gcc 4.5.1, но не так много библиотек, с которыми их можно связать (библиотека util-linux-ng, которая содержит версию сценария, упомянутую в ответе, не компилируется для части getopt). У меня также есть несколько версий компилятора IBM XL xlc. Причина, по которой я не указал в первую очередь, заключается в том, что я надеялся на некоторые уловки оболочки, возможно, с exec, а не во внешней программе.

Ответы [ 3 ]

6 голосов
/ 30 октября 2010

Попробуйте:

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

Это работает в сценарии оболочки (не в интерактивном режиме) с использованием

$ script --version
script (util-linux-ng 2.16)

Вы также можете использовать expect.

Также см .: Перехват прямого перенаправления в /dev/tty.

2 голосов
/ 02 ноября 2010

Сначала я отвечаю на второй вопрос: в качестве варианта дизайна модуль является пробным, и они выбрали (сомнительный) выбор, используя stderr / tty вместо stdout / stderr, чтобы упростить свою сторону разработки. Смотрите здесь .

Мое решение, так как я не мог использовать другие рекомендуемые инструменты (например, скрипт, предположить), это следующая мини-оболочка 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
0 голосов
/ 30 октября 2010

Похоже, module записывает в /dev/tty, который всегда является консолью, связанной с процессом.Если так, то я не думаю, что вы можете что-то с этим поделать.Как правило, это делается для того, чтобы человек увидел сообщение (при условии, что программа была вызвана в интерактивном режиме).

...