Estou tentando entender pipes nomeados no contexto deste exemplo em particular.
Digito <(ls -l)
no meu terminal e recebo a saída como bash: /dev/fd/63: Permission denied
,.
Se eu digitar cat <(ls -l)
, poderá ver o conteúdo do diretório. Se eu substituir o cat
por echo
, acho que recebo o nome do terminal (ou é?).
echo <(ls -l)
dá a saída como /dev/fd/63
.
Além disso, este exemplo de saída não está claro para mim.
ls -l <(echo "Whatever")
lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -> pipe:[48078752]
No entanto, se eu der, ls -l <()
ele me lista o conteúdo do diretório.
O que está acontecendo no caso do pipe nomeado?
mkfifo
cria apenas o canal nomeado, sem nenhum conteúdo. Então você precisa escrever para você mesmo (por exemplomkfifo mypipe; ls > mypipe
). E sim, as gravações no canal serão bloqueadas até que algum processo seja lido no canal./dev/fd/63
é um tubo anônimo.file <(ls)
. O shell cria um canal anônimo, mas o descritor de arquivo reflete como um canal nomeado/dev/fd
. Se fosse um canal anônimo, não teria um nome e não poderia ser aberto por um comando ao qual/dev/fd/63
é passado./dev/fd
podem se referir a qualquer arquivo descritor, até canos e soquetes anônimos, soquetes de rede, segmentos de memória compartilhada, etc.Você entende mal o
ls
comando e o redirecionamento.ls
lista os arquivos e diretórios fornecidos na linha de comando, não acredito que aceite qualquer entrada do stdin. Redirecionamento>
>>
e<
são maneiras de usar um arquivo para fornecer entrada e coletar saída.fonte
<(…)
é uma substituição de processo.x|y
praticamente o mesmo e quase idêntico ao[num]<<REDIRECT
de algumas conchas. Onde difere é a substituição literal do shell do link fd -/dev/fd/63
e etc e o que ele faz - ou não - com stdin. Façaecho | readlink /dev/fd/0
e veja por si mesmo.dev
link - um arquivo especial. você pode fazer o mesmo com qualquer descritor de arquivo na maioria dos sistemas linux - mesmo típico|pipes
, embora eu não ateste o comportamento em outro lugar. Eu entendo de onde você está, mas um pipe nomeado é uma coisa separada em si - é uma referência do sistema de arquivos a um pipe no kernel - uma referência regular do sistema de arquivos, não um arquivo de dispositivo./dev/fd/*
criação de um pipe nomeado em outro lugar. Mas entendo que/dev/fd/*
ele próprio é um mecanismo diferente de um pipe nomeado propriamente dito. Aliás, a descrição da Wikipedia poderia ter uma explicação para essa distinção./dev/fd/*
não estiver disponível, o bash criará um pipe nomeado/tmp
e o usará para substituição de processos. Não me parece tão estranho, apenas disponibilizando a funcionalidade no maior número possível de ambientes.