Как подключить stdout, сохраняя его на экране? (а не выходному файлу)

Я хотел бы передать стандартный вывод программы, сохраняя ее на экране.

С простым примером (echo используйте здесь только для иллюстрации):

$ echo 'ee' | foo
ee < - выход, который я хотел бы видеть

Я знаю, что tee может скопировать stdout в файл, но это не то, что я хочу.
$ echo 'ee' | tee output.txt | foo

Я попробовал $ echo 'ee' | tee /dev/stdout | foo, но он не работает, так как вывод tee на /dev/stdout передается на foo

Ответ 1

Вот решение, которое работает в любой реализации Unix/Linux, при условии, что оно будет следовать стандарту POSIX. Он работает в некоторых не Unix-средах, таких как cygwin.

echo 'ee' | tee /dev/tty | foo

Ссылка: Открытая группа базовых спецификаций, выпуск 7 IEEE Std 1003.1, издание 2013 г., §10.1:

/DEV/TTY

Связанный с группой процессов этого процесса, если таковые имеются. Это полезно для программ или процедур оболочки, которые хотят быть уверены в записи сообщений или чтении данных с терминала, независимо от того, как перенаправлен вывод. Он также может использоваться для приложений, которые требуют имя файла для вывода, когда требуется типизированный вывод, и утомительно выяснять, какой терминал используется в настоящее время. В каждом процессе синоним управляющего терминала

Сообщалось, что в некоторых средах, таких как Google Colab, не реализована /dev/tty хотя их команда tty возвращает работоспособное устройство. Вот обходной путь:

tty=$(tty)
echo 'ee' | tee $tty | foo

или с древней скорлупой Борна:

tty='tty'
echo 'ee' | tee $tty | foo

Ответ 2

Еще одна вещь, которую нужно попробовать:

echo 'ee' | tee >(foo)

>(foo) - это замена процесса.

Ответ 3

Try:

$ echo 'ee' | tee /dev/stderr | foo

Если использовать stderr - это вариант, конечно.

Ответ 4

Доступ к "/dev/stdout" запрещен в некоторых системах, но доступ к пользовательскому терминалу предоставляется "/dev/tty". Используя "wc" для "foo", приведенные выше примеры работают нормально (на linux, OSX и т.д.) Как:

% echo 'Hi' | tee /dev/tty | wc Hi 1 1 3

Чтобы добавить счет в нижней части списка совпадающих файлов, я использую что-то вроде:
% ls [A-J]* | tee /dev/tty | wc -l

Чтобы не вспоминать все это, я определяю псевдонимы:
% alias t tee /dev/tty
% alias wcl wc -l

чтобы я мог просто сказать:
% ls [A-J]* | t | wcl


POSTSCRIPT: для младшего набора, который может выглядеть на его произношении как "титти", я мог бы добавить, что "tty" когда-то был общим аббревиатура для терминала "телетайпа", в котором использовался рулон желтого цвета бумага и круглые ключи, которые часто застревают.

Ответ 5

сначала вам нужно выяснить терминал, связанный с вашим экраном (или в зависимости от того, на каком экране вы хотите отображать вывод):

tty

то вы можете вывести вывод на этот терминал и передать другую копию через вашу программу foo:

echo ee | tee /dev/pty/2 | foo