Перенаправить вывод программы Python в /dev/null

У меня есть исполняемый файл Python, написанный и скомпилированный кем-то другим, который мне просто нужно запустить один раз на полпути моего собственного скрипта bash. Программа использует текстовый интерфейс, поэтому ждет продолжения ввода, но ключевые операции, которые она выполняет при запуске, необходимы в моем bash-скрипте. Грязная (и странная) процедура, которую я знаю, но, к сожалению, у меня нет других вариантов.

Я получил возможность принудительно закрывать программу с помощью сигнала уничтожения, но TUI программы настаивает на выводе туда, где она запускается. Я попытался перенаправить как stdout, так и stderr в /dev/null и запустить программу в фоновом режиме, добавив суффикс амперсанда, но просто не могу заставить его играть в мяч. Я считаю, что причина в том, что программа порождает другие процессы, и перенаправление вывода родительского процесса не влияет на них. Есть ли какой-нибудь прием, который я могу использовать, чтобы перенаправить все выходные данные дочерних процессов?

1 ответ

Программа может писать в tty вместо stdout. Вы можете использовать unbuffer сценарий, который поставляется с expect или какой-то другой метод, использующий expect или что-то подобное.

Вот демонстрация. Создайте этот скрипт и назовите его "writetty". Тогда делай chmod u+x writetty:

#!/bin/bash
date > /dev/tty

Теперь попробуйте:

$ ./writetty
Tue Jun  8 12:24:36 CDT 2010
$ ./writetty > /dev/null
Tue Jun  8 12:24:46 CDT 2010
$ var=$(./writetty)
Tue Jun  8 12:24:56 CDT 2010
$ unbuffer ./writetty > /tmp/writetty.out
$ cat /tmp/writetty.out
Tue Jun  8 12:25:06 CDT 2010
$ var=$(unbuffer ./writetty)
$ echo $var
Tue Jun  8 12:25:16 CDT 2010

Вы могли бы использовать expect отвечать на запрос программы на ввод, а не убивать его.

Другие вопросы по тегам