$ echo <(echo 1) <(echo 2)
/dev/fd/63 /dev/fd/62
The shell spawns two commands connected to pipes, then replaces those with a file that represents the other (read) side of that pipe.The command above with >(grep something) does the same thing, just with the other end of a pipe.
This is explained in more detail here:
https://askubuntu.com/questions/172982/what-is-the-differenc...
| is the pipe operator in sh for doing a shell "pipeline". However, the parent comment is referring to a linux pipe as in pipe(7) [0].
One easy way to see this is with the following:
$ ls -l <(echo foo)
lr-x------ 1 user group Jan 12 01:23 /proc/self/fd/16 -> 'pipe:[2937585]'
As you can see, that command created a fd (16) which referred to a pipe (pipe:[2937585]).Those file descriptors were created using the pipe(2)[1] call by the shell, so it seems fine to refer to them to pipes.
I'll also note that <() / >() are _not_ using the "redirection operator". They're actually distinct operators for "process substitution"[2] in bash terminology. They look similar to redirects, but they're not the same operator, so that stack overflow answer isn't really relevant.
[0]: http://man7.org/linux/man-pages/man7/pipe.7.html
In case of unnamed pipe the fds just exist as long as the process is running, then it disappears. Point is it’s irrelevant what you refer to as pipe, at the end of the day some file-like object is either written to or read from. And really, that file-like object is actually just a buffer.
# cat <(ls -l /proc/self/fd/)
total 0
lrwx------ 1 root root 64 Jan 12 15:02 0 -> /dev/pts/0
l-wx------ 1 root root 64 Jan 12 15:02 1 -> pipe:[20519634]
lrwx------ 1 root root 64 Jan 12 15:02 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 12 15:02 3 -> /proc/23611/fd/
# ls -l /proc/self/fd/ | cat -
total 0
lrwx------ 1 root root 64 Jan 12 15:02 0 -> /dev/pts/0
l-wx------ 1 root root 64 Jan 12 15:02 1 -> pipe:[20518265]
lrwx------ 1 root root 64 Jan 12 15:02 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan 12 15:02 3 -> /proc/23621/fd/https://github.com/coreutils/coreutils/blob/master/src/cat.c...
It’s an intentional design decision.
A quick search says that Windows has support for named pipes as an IPC mechanism [1], but I’ve never used them. But this is a Windows API. I am not aware for any way to do this with plain cmd.exe. You’re not the first to ask though... [2]
[1] https://docs.microsoft.com/en-us/windows/win32/ipc/named-pip...
[2] https://superuser.com/questions/430466/in-windows-can-i-redi...
Even the echo example hints, that the created pipe has a name, and that name is then simply passed as the argument to the command.