Как передать стандартный вывод, сохраняя его на экране? (а не в выходной файл) - PullRequest
200 голосов
/ 15 апреля 2011

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

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

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

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

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

Ответы [ 5 ]

287 голосов
/ 15 апреля 2011

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

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

Ссылка: Базовые спецификации Open Group Issue 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
59 голосов
/ 15 апреля 2011

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

echo 'ee' | tee >(foo)

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

18 голосов
/ 02 апреля 2015

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

15 голосов
/ 15 апреля 2011

Попробуйте:

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

Если, конечно, можно использовать stderr.

8 голосов
/ 03 августа 2013

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

tty

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

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