By Léo Léopold Hertz 준영

2009-04-18 23:23:29 8 Comments

Manual states that the tee is a "pipe fitting"-tool. The cases [1] confuse me:

1. case

echo "foo bar" | sudo tee -a /path/to/some/file

2. case

:w !sudo tee %

It is hard to understand the logic of tee from the cases. How does the tee work?


@Girdhar Singh Rathore 2016-08-26 11:49:59

tee is normally used to split the output of a program so that it can be both displayed and saved in a file. The command can be used to capture intermediate output before the data is altered by another command or program. The tee command reads standard input, then writes its content to standard output. It simultaneously copies the result into the specified file(s) or variables

tee [OPTION]... [FILE]...

For instance

tee [ -a ] [ -i ]... [ File ]...
  • -a Appends the output to the end of File instead of writing over it.

  • -i Ignores interrupts.

enter image description here

With sudo and appending to the file with your example in the question

ls -l | sudo tee -a file.txt 

@Léo Léopold Hertz 준영 2016-08-26 12:25:46

Maybe, you can then show how you redirect the output also to less when you already use sudo.

@Abhishek choudhary 2014-10-31 06:40:01

tee command simply creates N+1 no of files , 1 copy passed to stdout and others to the arguments provided to tee (ie files ) where N: number of agruments passed to tee

@Léo Léopold Hertz 준영 2009-08-24 07:52:24

Explanations for the Cases

1. the escalation of permissions with the sudo- and -tee commands

The example is not about just logic, rather convention. It shows the convention to escalate permissions:

echo "Body of file..." | sudo tee root_owned_file > /dev/null

This example shows tee being used to bypass an inherent limitation in the sudo command. sudo is unable to pipe the standard output to a file. By dumping its stdout stream into /dev/null, we also suppress the mirrored output in the console.

2. running sudo-commands with Vim

Since you can use Sudo-commands with Vim, you can use the command if you forgot to run as a sudo. It is useful in places such as /etc/init.d/, where you will find read-only files.

Logic with the tee-command

It is like a branch in Git, or better, please, see the T analogy by Rick Copeland. Hopefully, the modified example (original) helps to understand its use:

curl "" | tee original_site | sed 's/[^a-zA-Z ]/ /g' | tr 'A-Z ' 'a-z\n' | grep '[a-z]' | sort -u | comm -23 - /usr/share/dict/words

@Jonathan Leffler 2009-04-19 00:58:31

I find that the tee command is very useful in debugging shell scripts that contain long pipelines. This is the tail-end of a ghastly shell script that is a decade overdue for a rewrite in Perl, but it still works. (It was last modified in 1998, as it happens.)

# If $DEBUG is yes, record the intermediate results.
if [ "$DEBUG" = yes ]
    cp $tmp.1 tmp.1
    cp $tmp.2 tmp.2
    cp $tmp.3 tmp.3
    tee4="| tee tmp.4"
    tee5="| tee tmp.5"
    tee6="| tee tmp.6"
    tee7="| tee tmp.7"

# The evals are there in case $DEBUG was yes.
# The hieroglyphs on the shell line pass on any control arguments
# (like -x) to the sub-shell if they are set for the parent shell.
for file in $*
    eval sed -f $tmp.1 $file                $tee4 |
    eval sed -f $tmp.3                      $tee5 |
    eval sh ${-+"-$-"}                      $tee6 |
    eval sed -f $tmp.2                      $tee7 |
    sed  -e '1s/^[  ]*$/[email protected]/' -e '/^[email protected]/d'

The three sed scripts that are run are ghastly - I don't plan to show them. This is also a semi-decent use of eval. The normal temporary file names ($tmp.1, etc) are preserved by a fixed name (tmp.1, etc), and the intermediate results are preserved in tmp.4 .. tmp.7. If I were updating the command, it would use '"[email protected]#"' instead of '$*' as shown. And, when I'm debugging it, then there is but one file in the argument list, so the trampling of the debug files is not an issue for me.

Note that if you need to do so, you can create several copies of the input at one time; there is no need to feed one tee command into another.

If anyone needs it, I have a variant of tee called tpipe which sends copies of the output to multiple pipelines instead of multiple files. It keeps going even if one of the pipelines (or standard output) terminates early. (See my profile for contact info.)

@Chris Jester-Young 2009-04-18 23:34:05

Remember that the target of tee is not restricted to regular files, but can be to devices, FIFOs, etc. Also, you can pipe to another tee invocation, and so on. :-)

@Rick Copeland 2009-04-18 23:28:37

tee is used to split a command pipeline, allowing you to save the output of a command to a file and send it along down the pipeline. In the first example you gave::

echo "foo bar" | sudo tee -a /path/to/some/file

"foo bar" will be echoed to standard output and appended to /path/to/some/file. Think of tee like a "T" joint in a pipe, splitting the output into two other pipes.

@Joey 2009-09-28 06:32:45

That's where the name comes from :-)

@lothar 2009-04-18 23:28:35

tee simply mirrors the output into a file that can be specified as the argument to tee.

In the case you show tee is called as the super user (via sudo) and it's sole purpose is to write a file as the super user instead if the user that does the echo.

@David Schmitt 2009-04-18 23:28:08

tee copies stdin to stdout (like cat) and additionally writes everything to the named file. Using it this way with sudo allows one to push information into a privileged mode and - at the same time - monitor whether the right stuff went there.

Also note, that due to the way redirection is handled in the shell the almost equivalent

sudo echo "foo bar" > /path/to/some/file

won't work, since the redirection would be done by the calling user and not by the sudo target user.

@Shantesh 2016-01-07 12:10:43

what if the stdout data is too large how does it push data to file ? by size or by time period ?

Related Questions

Sponsored Content

24 Answered Questions

[SOLVED] How to permanently set $PATH on Linux/Unix?

  • 2013-02-01 00:57:08
  • Click Upvote
  • 1658599 View
  • 904 Score
  • 24 Answer
  • Tags:   linux bash unix path zsh

7 Answered Questions

[SOLVED] Use tee (or equivalent) but limit max file size or rotate to new file

1 Answered Questions

[SOLVED] Writing a log file with tee

  • 2016-07-28 21:23:16
  • Adhin37
  • 3451 View
  • 1 Score
  • 1 Answer
  • Tags:   unix echo ksh tee

19 Answered Questions

[SOLVED] How can I convert a Unix timestamp to DateTime and vice versa?

9 Answered Questions

[SOLVED] How do I write stderr to a file while using "tee" with a pipe?

  • 2009-03-28 01:53:04
  • jparanich
  • 265169 View
  • 568 Score
  • 9 Answer
  • Tags:   linux bash unix

3 Answered Questions

[SOLVED] grep without showing path/file:line

  • 2013-10-16 14:55:39
  • Allan Thomas
  • 177774 View
  • 244 Score
  • 3 Answer
  • Tags:   linux unix grep find

2 Answered Questions

[SOLVED] Tee to commands only, not stdout

  • 2019-04-05 03:36:57
  • Zoey Hewll
  • 107 View
  • 1 Score
  • 2 Answer
  • Tags:   bash tee

22 Answered Questions

[SOLVED] grep a tab in UNIX

  • 2009-12-01 11:23:13
  • Sachin Chourasiya
  • 258636 View
  • 430 Score
  • 22 Answer
  • Tags:   unix grep

2 Answered Questions

3 Answered Questions

[SOLVED] Simple tee example

  • 2015-06-10 19:37:19
  • Marty Wallace
  • 1003 View
  • 1 Score
  • 3 Answer
  • Tags:   linux shell tee

Sponsored Content