Jun 162014


The command “tee” it’s one of the basic commands that you should find in any system, yet it’s not so popular or use, this command reads standard input and writes it to both standard output and one or more files, effectively duplicating its input. It is primarily used in conjunction with pipes and filters. The command is named after the T-splitter used in plumbing.

In short if you want to redirect the STDOUT of any command as well as printing it to the screen, tee is the right tool to use, let’s see some practical use of this command.

Basic Usage

The basic usage of tee it’s:

tee [ -a ] [ -i ] [ File ... ]

The 2 options of tee means:

-a Appends the output to the end of File instead of writing over it.
-i Ignores interrupts.

So a basic usage would be:

./program | tee logfile

The command above will execute the ‘program’. All the output will be redirected to ‘logfile’ while you can simultaneously view them on stdout also.

And now some more complex and maybe useful examples:

1) Use tee to process a pipe with two or more processes

echotee can split a pipe in two”|tee >(rev) >(tr ‘ ‘ ‘_’)

The output of this command is:

$ echo "tee can split a pipe in two"|tee >(rev) >(tr ' ' '_')
tee can split a pipe in two
$ owt ni epip a tilps nac eet

Tee can be used to split a pipe into multiple streams for one or more process to work it. You can add more ” >()” for even more fun.

2) Save a file as root with your normal user

Sometimes you start to edit a file without noticing that you can’t save it for permissions problems, tee can easily save you in this case, as example:

$ vim /etc/passwd
[:w !sudo tee %]

In vim this means:

:w saves the file
!sudo calls the sudo command
tee redirects vim’s output
% the current file

After this command you’ll have saved successfully your file and can exit safely from the editor.

3) Duplicate several drives concurrently

dd if=/dev/sda | tee >(dd of=/dev/sdb) | dd of=/dev/sdc

If you have some drive imaging to do, you can boot into any liveCD and use a commodity machine. The drives will be written in parallel.

To improve efficiency, specify a larger block size in dd:

dd if=/dev/sda bs=64k | tee >(dd of=/dev/sdb bs=64k) | dd of=/dev/sdc bs=64k

To image more drives , insert them as additional arguments to tee:

dd if=/dev/sda | tee >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) | dd of=/dev/sde

5) Run a command on a group of nodes in parallel via ssh

There are a lot of tools and utility to give the same command on multiple nodes, a really simple way is this one:

echouptime| tee >(ssh host1) >(ssh host2) >(ssh host3)

6) Simple terminal redirection with script and tee

Using the script command you can
display the commands and their output to another user who is connected to another terminal, by example pts/3

script /dev/null | tee /dev/pts/3

Popular Posts:

Flattr this!

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>