Golang получить команду tty выход - PullRequest
1 голос
/ 20 сентября 2019

Я использую команду go exec Run для получения выходных данных команды, которая прекрасно работает, когда в поле команды 'Stdout' установлено значение os.Stdout, а ошибка отправляется на os.Stderr.

IЯ хочу, чтобы вывод и вывод ошибок выводились на консоль, но я также хочу, чтобы моя программа видела вывод.

Затем я создал свой собственный тип Writer, который делал именно это, записывал и в буфер, ираспечатывается на терминал.

Вот проблема: некоторые приложения изменяют свой вывод на что-то гораздо менее читаемое людьми, когда обнаруживает, что оно не пишет в tty.Таким образом, вывод, который я получаю, меняется на что-то безобразное, когда я делаю это последним способом.(очиститель для компьютеров, уродливее для людей)

Я хотел бы знать, есть ли какой-то способ в Go убедить любую команду, которую я запускаю, в том, что я tty, несмотря на то, что я не os.Stdout/os.Stderr.Я знаю, что это можно сделать с помощью команды script bash, но она использует другой флаг в зависимости от Darwin / Linux, поэтому я стараюсь этого избегать.

Заранее спасибо!

1 Ответ

3 голосов
/ 20 сентября 2019

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

Вы можете начать с этого запроса .

. github.com/creack/pty, вероятно, является хорошей отправной точкой.

Следующим шагом будет создание пакета, реализующего PTY, для его фактического выделения и подключения «другого конца» PTY к вашему пользовательскому устройству записи.

(Кстати, нет смысла писать пользовательский «многопользовательский режим»"как существует io.MultiWriter).

...