Unix: confusing use of the Tee -command

前端 未结 8 1822
野趣味
野趣味 2021-02-07 14:31

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/fi         


        
相关标签:
8条回答
  • 2021-02-07 14:33

    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.

    0 讨论(0)
  • 2021-02-07 14:34

    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.

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

    ls -l | sudo tee -a file.txt 
    
    0 讨论(0)
  • 2021-02-07 14:37

    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.

    0 讨论(0)
  • 2021-02-07 14:40

    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. :-)

    0 讨论(0)
  • 2021-02-07 14:46

    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.

    0 讨论(0)
  • 2021-02-07 14:46

    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 "http://en.wikipedia.org/wiki/Pipeline_(Unix)" | 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
    
    0 讨论(0)
提交回复
热议问题