Skip Navigation

correct way to echo | sudo tee

Can someone explain why this would make the command wait forever? What is tee waiting for?

 bash
    
echo "test" | sudo tee newfile


  

What would be a scriptable workaround for such cases?

Edit: this command would not terminate in zsh. This works fine in bash tho.

16 comments
  • Can’t reproduce.

     
        
    16:22:48:~/tmp$ echo foo | sudo tee newfile
    [sudo] Passwort für bleistift2:         
    foo
    
    16:23:02:~/tmp$ ls -l newfile
    -rw-r--r-- 1 root root 4 Feb 23 16:22 newfile
    
      
    • I just switched over to bash and it worked lol. It just didn't return for me in zsh...

      • I use zsh and it works fine for me fwiw. Same with zsh --no-rcs (which doesn't load zshrc). Maybe you have some weird setting enabled?

      • My initial guess was that sudo would eat up the echo’d foo as the password. Maybe sudo works differently when invoked via zsh?

      • It works here in zsh, did you mistype the closing quote? Although that alters my prompt.

  • I'm gonna take a couple of stabs in the dark.

    According to this Stack Overflow answer using tee can prevent the prompt from drawing which makes it appear that a script has not terminated. The answerer's workaround is to put a very short sleep command after the tee command.

    If this is what happened to you maybe the reason the script works in bash but not in zsh is because you have different prompts configured in those two shells.

    Another idea is to replace tee with sponge from moreutils. The difference is that sponge waits for the end of stdin before it starts writing which can avoid problems in some situations.

    • Nice one, didn't know about moreutils. I indeed used p10k on top of zsh. New zsh instance without sourcing anything zsh --no-rcs managed to write to file without issues. Thanks

16 comments