This is called process substitution.
The <(list) syntax is supported by both, bash and zsh. It provides a way to pass the output of a command (list) to another command when using a pipe (|) is not possible. For example when a command just does not support input from STDIN or you need the output of multiple commands:
diff <(ls dirA) <(ls dirB)
<(list) connects the output of list with a file in /dev/fd, if supported by the system, otherwise a named pipe (FIFO) is used (which also depends on support by the system; neither manual says what happens if both mechanisms are not supported, presumably it aborts with an error). The name of the file is then passed as argument on the command line.
zsh additionally supports =(list) as possible replacement for <(list). With =(list) a temporary file is used instead of file in /dev/fd or a FIFO. It can be used as a replacement for <(list) if the program needs to lseek in the output.
According to the ZSH manual there might also be other issues with how <(list) works:
The = form is useful as both the /dev/fd and the named pipe implementation of <(...) have drawbacks. In the former case, some programmes may automatically close the file descriptor in question before examining the file on the command line, particularly if this is necessary for security reasons such as when the programme is running setuid. In the second case, if the programme does not actually open the file, the subshell attempting to read from or write to the pipe will (in a typical implementation, different operating systems may have different behaviour) block for ever and have to be killed explicitly. In both cases, the shell actually supplies the information using a pipe, so that programmes that expect to lseek (see man page lseek(2)) on the file will not work.
pfctl -f <(echo "pf rules")would say bad file descriptor. using zsh and =(echo "pf rules") instead works. – johnnyB Dec 20 '17 at 22:42<(command)format. – Elijah Lynn Feb 28 '20 at 22:50psub. – Adaephon Mar 06 '20 at 08:33(command)part. Or does that include the<prefix as well or is there another name for that part? – Elijah Lynn Mar 06 '20 at 16:38<(acts as a different token from lone<. Process substitution doesn't even behave like redirection (it doesn't alter the 'primary' command's stdin or stdout, but expands into a word) -- so it is definitely not the same as just having a<followed by( ). – u1686_grawity Apr 25 '20 at 14:09<required, and<(is not enough if it already redirects the stout of a command to a /dev/fd file? For example whyhead -c1 <(echo test)works fine andread x <(echo test)not? – gnom1gnom Dec 09 '20 at 13:56headtakes a file parameter, whilereadtakes stdin behind the scene, after process substitution, these commands look as followshead -c1 /dev/fd/63read x < /dev/fd/63– gnom1gnom Dec 09 '20 at 15:17<(...)file – minseong Mar 29 '21 at 22:01=(); see here – forresthopkinsa Oct 17 '22 at 20:47