A substituição do processo resulta em um arquivo especial (como /dev/fd/63 em seu exemplo) que se comporta como o final de leitura de um canal nomeado. Este arquivo pode ser aberto e lido, mas não escrito, não visualizado.
Comandos que tratam seus argumentos como fluxos puros funcionam enquanto comandos que esperam procurar em arquivos que recebem (ou escrever para eles) não funcionarão. O tipo de comando que funcionará é o que geralmente é considerado um filtro: cat , grep , sed , gzip , awk , etc ... Um exemplo de um comando que não funciona é um editor como vi ou uma operação de arquivo como mv .
gcc deseja poder executar acesso aleatório em seus arquivos de entrada para detectar em qual idioma eles são gravados. Se você der gcc uma dica sobre o idioma do arquivo de entrada, ficará feliz em transmitir o arquivo:
gcc -x c <(echo 'int main(){return 0;}')
A forma mais simples e direta sem substituição de processo também funciona:
echo 'int main(){return 0;}' | gcc -x c -
Observe que isso não é específico para bash . Todas as camadas que suportam a substituição do processo se comportam da mesma maneira.