Because the shell opens the pipe to the command in the
<(...), and passes the file handle to the child process it runs,
sudo in this case. The path
/dev/fd/63 is a method provided by the kernel to allow access to an already open file handle through a normal pathname.
sudo doesn't pass the handle on to the process it runs (for security reasons): by default it closes all file handles except stdin, stdout and stderr, so the program that eventually runs doesn't have the file handle corresponding to
/dev/fd/63 and it errors out.
You can solve it by doing the substitution in a shell within sudo:
sudo bash -c 'cat <(echo something)'
This, of course means that the inner substitution also runs with elevated privilege:
$ sudo bash -c 'cat <(id)'
uid=0(root) gid=0(root) groups=0(root)
-C flag for
sudo offers another way, but it may need extra configuration to be allowed:
-C num, --close-from=num
Close all file descriptors greater than or equal to num before executing a command. Values less than three are not permitted. By default, sudo will close all open file descriptors other than
standard input, standard output and standard error when executing a command. The security policy may restrict the user's ability to use this option. The sudoers policy only permits use of the -C
option when the administrator has enabled the closefrom_override option.