Как подключить 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