Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pipe stdout while keeping it on screen ? (and not to a output file)

I would like to pipe standard output of a program while keeping it on screen.

With a simple example (echo use here is just for illustration purpose) :

$ echo 'ee' | foo
ee <- the output I would like to see

I know tee could copy stdout to file but that's not what I want.
$ echo 'ee' | tee output.txt | foo

I tried
$ echo 'ee' | tee /dev/stdout | foo but it does not work since tee output to /dev/stdout is piped to foo

like image 409
gentooboontoo Avatar asked Apr 15 '11 13:04

gentooboontoo


People also ask

How do I redirect output from stdout to a file?

Redirecting stdout and stderr to a file: The I/O streams can be redirected by putting the n> operator in use, where n is the file descriptor number. For redirecting stdout, we use “1>” and for stderr, “2>” is added as an operator.

What Linux command would you use to redirect output to a file and have it display on stdout?

If you want to redirect both “stdout” and “stderr”, then use “&>” . Now we will use this redirection symbol to redirect the output into the file.

How do I redirect output to a file and screen in Linux?

“tee” command is one of the most valuable tools that helps a Linux user redirect the output of a command to a file and screen. This article discussed the primary usage of “tee” for redirecting output to screen, single, or multiple files.

Which command send output to both the screen and a file at the same time?

The command is called tee.


1 Answers

Here is a solution that works at on any Unix / Linux implementation, assuming it cares to follow the POSIX standard. It works on some non Unix environments like cygwin too.

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

Reference: The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition, §10.1:

/dev/tty

Associated with the process group of that process, if any. It is useful for programs or shell procedures that wish to be sure of writing messages to or reading data from the terminal no matter how output has been redirected. It can also be used for applications that demand the name of a file for output, when typed output is desired and it is tiresome to find out what terminal is currently in use. In each process, a synonym for the controlling terminal

Some environments like Google Colab have been reported not to implement /dev/tty while still having their tty command returning a usable device. Here is a workaround:

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

or with an ancient Bourne shell:

tty=`tty` echo 'ee' | tee $tty | foo 
like image 193
jlliagre Avatar answered Oct 06 '22 07:10

jlliagre