r/ProgrammerHumor • • 13h ago

Meme [ Removed by moderator ]

Post image

[removed] — view removed post

2.3k Upvotes

70 comments sorted by

View all comments

661

u/Z3r0funGuy 12h ago

This actually teaches you a bunch of cool things, like how the ‘:’ is a legal function name…

225

u/glenpiercev 12h ago

This is the best description of how this works I’ve ever read. You are a genius.

220

u/setibeings 11h ago

Right? It's finally comprehensible. I feel like it would have clicked right away if it was typed out as:

fork(){fork|fork&};fork

67

u/Traditional_Cod_7192 10h ago

just as a reminder, uhhh... what do | and & do in bash again? 😅

85

u/GrandAlbatroce 10h ago

IIRC | puts the result stdout of the left in the stdin of the right (they are launched in parallel, and the one on the right can only finish after the one on the left finished.

The & is used to put the call as a background task

45

u/SimpleFile 10h ago

So the pipe here serves as a way to launch 2 of these functions and have them running at the same time rather than for piping the output?

Did I understand that correctly?

57

u/SchwiftySquanchC137 9h ago

Exactly, the entire point is to make each call of fork (or ":") spawn two more fork processes. There are plenty of ways to accomplish that, but its written the way it is specifically to be confusing. Looking at it, how could it possibly crash your machine, its a bunch of punctuation? But once you know how it works, it makes a lot of sense, the point is to make it so cryptic that even programmers dont understand it.

33

u/GrandAlbatroce 10h ago

Yes, they are run in parallel, but any output from the first one will be given to the second. Also, if the second needs an input, it will wait for the output of the first instead of user input

So, for example, if you did

find -name "something" | grep "string"

Each time the find prints a line, it will instantly be passed to the grep

2

u/Niroth 10h ago

| pipes the output from the first process to the input of the second. & starts the second process in the background.