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

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.

  • hallettj
    cake
    link
    fedilink
    English
    11 hour ago

    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.

  • @[email protected]
    link
    fedilink
    English
    54 hours ago

    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
    
    • Agility0971OP
      link
      24 hours ago

      I just switched over to bash and it worked lol. It just didn’t return for me in zsh…

      • @[email protected]
        link
        fedilink
        English
        34 hours ago

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

        • Agility0971OP
          link
          14 hours ago

          sudo does not prompt for password in my container. It just elevates the privileges straight away. Yeah, it’s hard to tell. Or test for that matter.

        • Agility0971OP
          link
          1
          edit-2
          4 hours ago

          no way. I’m in /tmp for this one

          echo 'test' | tee newfile
          tee: newfile: Permission denied
          test
          echo 'test' | sudo tee newfile #the prompt never returns when running this in zsh
          
  • @just_another_person
    link
    1
    edit-2
    4 hours ago

    Are you saying it waits forever, or you read somewhere it will wait forever and you want clarification?

    Guessing that file doesn’t exist already is the problem, and you don’t even need to use tee in this example.

    • Agility0971OP
      link
      14 hours ago

      what I was saying was that echo "text" | sudo tee newfile would hang and never return and needs to be interrupted. I just noticed this does not happen in bash but I was testing in zsh.

      Guessing that file doesn’t exist already is the problem, and you don’t even need to use tee in this example.

      you’ve missed the point here I’m afraid. But I’ll blame it on my for not explaining properly what I was intending to do.

      • @just_another_person
        link
        2
        edit-2
        4 hours ago

        ZSH is bash-compliant, but will not always behave like bash in all situations.

        Add sh -c before echo and see if that works

        • Agility0971OP
          link
          24 hours ago

          yep. that did it. I had to wrap the entire thing in quotes though

          sh -c "echo 'test' | sudo tee newfile"