this post was submitted on 23 Feb 2025
18 points (95.0% liked)

Linux

50396 readers
1949 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS
 

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.

top 16 comments
sorted by: hot top controversial new old
[–] [email protected] 1 points 3 hours 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] 6 points 6 hours ago (1 children)

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
[–] [email protected] 2 points 6 hours ago (3 children)

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

[–] [email protected] 1 points 26 minutes ago

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?

[–] [email protected] 3 points 6 hours ago (1 children)

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

[–] [email protected] 1 points 6 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.

[–] [email protected] 1 points 6 hours ago* (last edited 6 hours ago) (1 children)

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

[–] [email protected] 1 points 6 hours ago* (last edited 6 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
[–] [email protected] 4 points 6 hours ago

Maybe it's silently prompting you for your password?

[–] [email protected] 3 points 7 hours ago (1 children)

Why does newfile need sudo to be created?

You need it to be owned by root?

[–] [email protected] 1 points 6 hours ago (1 children)

yeah indeed. I'm setting up a container with these instructions for ROS2. There you'll have to add a repository to the apt sources list.

[–] [email protected] 1 points 5 hours ago

ROS

Fly you fools!

[–] [email protected] 1 points 7 hours ago* (last edited 7 hours ago) (1 children)

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.

[–] [email protected] 1 points 6 hours ago (1 children)

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.

[–] [email protected] 2 points 6 hours ago* (last edited 6 hours ago) (1 children)

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

Add sh -c before echo and see if that works

[–] [email protected] 2 points 6 hours ago

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

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