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

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

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

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

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

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

+173
15 апр. '11 в 13:05
источник поделиться
5 ответов

Вот решение, которое работает в любой реализации 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
+255
15 апр. '11 в 13:10
источник

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

echo 'ee' | tee >(foo)

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

+55
15 апр. '11 в 13:21
источник
другие ответы

Связанные вопросы


Похожие вопросы

Try:

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

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

+16
15 апр. '11 в 13:10
источник

Доступ к "/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" когда-то был общим аббревиатура для терминала "телетайпа", в котором использовался рулон желтого цвета бумага и круглые ключи, которые часто застревают.

+15
02 апр. '15 в 17:04
источник

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

tty

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

echo ee | tee /dev/pty/2 | foo
+8
02 авг. '13 в 20:04
источник

Посмотрите другие вопросы по меткам или Задайте вопрос