У меня есть исполняемый файл Python, написанный и скомпилированный кем-то другим, и мне просто нужно один раз запустить наполовину мой собственный сценарий bash. Программа использует текстовый пользовательский интерфейс, поэтому ожидает ввода перед продолжением, но ключевые операции, которые она выполняет при запуске, требуются в моем сценарии bash. Я знаю запутанную (и странную) процедуру, но, к сожалению, у меня нет других вариантов.
Я получил возможность принудительно закрыть программу сигналом уничтожения, но TUI программы настаивает на выводе туда, где он выполняется. Я пробовал перенаправить как stdout, так и stderr в / dev / null и запустить программу в фоновом режиме, добавив суффикс амперсанда, но просто не могу заставить его играть в мяч. Я считаю, что причина в том, что программа порождает другие процессы, и перенаправление вывода родительского процесса на них не влияет. Есть ли какой-нибудь трюк, который я могу использовать для перенаправления всего вывода дочерних процессов?
Программа может писать на 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
ответить на запрос программы о вводе вместо того, чтобы убивать ее.