2010-10-29 1 views
2

Это не-перенаправлены выход (если вы не знаете, что module есть, это не имеет большого значения):Как перенаправить программу, которая пишет в tty?

$ 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 связанные вопросы.

EDIT: кто-то спросил в комментарии, поэтому некоторые детали. Это в AIX 5.3 на 64 бита. У меня python 2.6.5 почти полностью доступен. У меня есть gcc 4.1.1 и gcc 4.5.1, но не так много библиотек, чтобы связать их (библиотека util-linux-ng, которая содержит версию скрипта, указанную в ответе, не может скомпилироваться для части getopt). У меня также есть несколько версий IBM XL compiler xlc. Причина, по которой я не указывал в первую очередь, это то, что я надеялся на некоторые трюки с оболочкой, возможно, с exec, а не во внешней программе.

ответ

2

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

Мое решение, так как я не мог использовать любой из других рекомендуемых инструментов (например, сценарий, ожидать) является следующий питон мини-обертка:

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

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

+0

Ну, проблема программа * не * вызывается в интерактивном режиме. И «script» - это обходной путь, который работает, но (по крайней мере, версия, которую я имею) работает только интерактивно. – Davide

+0

Моя рекомендация - это получить версию скрипта, поддерживающую -c. –

+0

К сожалению, это совсем не так, на этой платформе (AIX). Я пытаюсь, но думаю, это было бы слишком много усилий. Ожидайте также расследования. – Davide

4

Попробуйте это:

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

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

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

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

Также смотрите: Catching a direct redirect to /dev/tty.