Como o shell abre o canal para o comando no <(...)
e passa o identificador de arquivo para o processo filho que ele executa, sudo
neste caso. O caminho /dev/fd/63
é um método fornecido pelo kernel para permitir o acesso a um identificador de arquivos já aberto através de um nome de caminho normal.
No entanto, sudo
não passa o identificador para o processo que executa (por motivos de segurança): por padrão, ele fecha todos os identificadores de arquivos, exceto stdin, stdout e stderr, portanto o programa que é executado o identificador de arquivo correspondente a /dev/fd/63
e com erros.
Você pode resolvê-lo fazendo a substituição em um shell dentro do sudo:
sudo bash -c 'cat <(echo something)'
Isso, naturalmente, significa que a substituição interna também é executada com privilégio elevado:
$ sudo bash -c 'cat <(id)'
uid=0(root) gid=0(root) groups=0(root)
o sinal -C
para sudo
oferece outra maneira, mas pode ser necessário configurar extras para serem permitidos:
-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.