Захват вывода без перенаправления и оставьте его на терминале тоже

Мне нужно захватить вывод демона, который также включает режим по требованию и ведет себя по-разному в зависимости от того, идет ли выход tty или нет. Просто перенаправление stdout в любом месте позволяет перейти в режим ведения журнала, где он записывает данные в неудобном формате и в ATM, потребуется слишком много времени, чтобы перенастроить его, чтобы в противном случае / исправить его / попросить автора.

Могу ли я как-то просто запустить его, как обычно, т.е. без перенаправления, но все равно получить копию всего, что он пишет на экран в файле?

  • io перенаправление на «крест» 2 программы
  • Восстановление вывода на терминал после выдачи «exec &> filename»
  • Как определить, является ли вывод команды или сценария оболочки стандартным или stderr
  • Как перенаправить вывод запущенной программы в / dev / null
  • Перенаправление после запуска процесса
  • Что случилось с этим использованием перенаправления?
  • Восстановление вывода на терминал после выдачи «exec &> filename»
  • Как определить, является ли вывод команды или сценария оболочки стандартным или stderr
  • Почему перенаправление STDERR на / dev / null выполняется таким образом?
  • является ли Linux перенаправлением «>>» медленнее с большими файлами?
  • Как перенаправить вывод запущенной программы в / dev / null
  • перенаправить в тот же файл, что и исходный файл, обработанный командой
  • One Solution collect form web for “Захват вывода без перенаправления и оставьте его на терминале тоже”

    Вы можете использовать socat чтобы сделать stdout mydaemon псевдотерминальным устройством и иметь все данные, записанные там, отправленные в трубу socat .

    Здесь, используя ls -l /proc/self/fd вместо mydaemon

     $ socat -u 'exec:"ls -l /proc/self/fd",pty,raw' - | tee file.out total 0 lrwx------ 1 stephane stephane 64 Aug 20 13:32 0 -> /dev/pts/25 lrwx------ 1 stephane stephane 64 Aug 20 13:32 1 -> /dev/pts/26 lrwx------ 1 stephane stephane 64 Aug 20 13:32 2 -> /dev/pts/25 lr-x------ 1 stephane stephane 64 Aug 20 13:32 3 -> /proc/30930/fd 

    Посмотрите, как stdout ls – это новое устройство pty ( /dev/pts/26 )

    Если у вас нет socat , вы также можете использовать script :

     $ script -qc 'stty raw; ls -l /proc/self/fd' file.out < /dev/null total 0 lrwx------ 1 stephane stephane 64 Aug 20 13:35 0 -> /dev/pts/26 lrwx------ 1 stephane stephane 64 Aug 20 13:35 1 -> /dev/pts/26 lrwx------ 1 stephane stephane 64 Aug 20 13:35 2 -> /dev/pts/26 lr-x------ 1 stephane stephane 64 Aug 20 13:35 3 -> /proc/31010/fd 

    ( < /dev/null – это так, что script не устанавливает ваш терминал в raw режиме).

    Обратите внимание, однако, что в этом случае все stdin, stdout и stderr перенаправляются на этот pty. Чтобы stdin и stderr не были затронуты, как с помощью подхода socat , вы могли бы сделать:

     $ script -qc 'stty raw; exec <&3 2>&4 3<&- 4>&-; ls -l /proc/self/fd' file.out 3<&0 4>&2 < /dev/null total 0 lrwx------ 1 stephane stephane 64 Aug 20 13:37 0 -> /dev/pts/25 lrwx------ 1 stephane stephane 64 Aug 20 13:37 1 -> /dev/pts/26 lrwx------ 1 stephane stephane 64 Aug 20 13:37 2 -> /dev/pts/25 lr-x------ 1 stephane stephane 64 Aug 20 13:37 3 -> /proc/31065/fd 

    Не все версии / версии script поддерживают параметр -c или -q .

    Обратите внимание, что некоторые системы поставляются с сценарием expect unbuffer для этого, но будьте осторожны, у него есть несколько ошибок и ограничений.

    Linux и Unix - лучшая ОС в мире.