No Linux, /dev/fd
é um link simbólico para /proc/self/fd
, onde /proc/self
é um link simbólico para o diretório de processo do processo de chamada. /proc/$pid/fd
, em seguida, contém links mágicos para os filehandles abertos. Bash usa isso para fazer canais que podem ser acessados por nome de arquivo sem precisar deixar nada no sistema de arquivos real.
Então, você precisa montar /proc
e criar o link simbólico /dev/fd
.
Alternativamente, você pode ver se é possível fazer com que o Bash use pipes nomeados no sistema de arquivos, de acordo com o manual , deve ser uma opção:
Process substitution is supported on systems that support named pipes (FIFOs) or the
/dev/fd
method of naming open files.
Mas isso parece exigir uma recompilação. O script configure
detecta automaticamente se /dev/fd
está disponível, mas você pode desativá-lo em config.h
, excluir a linha
#define HAVE_DEV_FD 1
(Ou altere para #undef HAVE_DEV_FD
para ter certeza. E não cometa o erro que cometi: alterar o 1
para um 0
não funciona.)
Com essas configurações, você obtém
$ ./bash -c 'ls -l <(echo foo)'
prw------- 1 itvirta itvirta 0 Nov 18 13:13 /tmp/sh-np.pldKay
No entanto, se você fizer isso com ls
ou algum outro comando que não vá ler o pipe, tanto o pipe quanto o processo do shell ficarão por aí.