você está aqui: Home  → Arquivo de Mensagens

Substituição de processos

Colaboração: Júlio Cezar Neves

Data de Publicação: 30 de janeiro de 2018

Baseado nos named pipes, existe também uma implementação muito interessante que é a Substituição de Processos (process substitution) que ocorre quando você põe um < ou um > grudado na frente do parêntese da esquerda. Teclando-se o comando:

$ cat <(ls -l)

O menor (<) tem que estar colado no parêntese

O que será que aconteceu para que isso funcionasse? Bem, de uma coisa podemos ter certeza: o que está à frente do cat, seu argumento, é um arquivo, senão o cat não funcionaria.

Para descobrirmos que tipo de arquivo é esse, vamos inverter o comando, de forma que o ls -l nos dê pistas do que está ocorrendo:

$ ls -l >(cat)
l-wx------ 1 julio julio 64 Set 19 15:18 /dev/fd/63 -> pipe:[20029]

Agora eu digo para você: da mesma forma que o fd 0 é a entrada padrão, o fd 1 é a saída padrão e o fd 2 é a saída de erros padrão, o fd 63 é um named pipe. Repare que o arquivo é um link para o processo que o executa, o que desta forma resulta que a saída do comando está sendo gerada por um arquivo tipo named pipe e temporário (só sobrevive durante a execução do comando).

Você deve estar pensando que isso é uma maluquice de nerd, né? Então suponha que você tenha dois diretórios: dir e dir.bkp e deseja saber se os dois estão iguais (aquela velha dúvida: será que meu backup está atualizado?). Basta comparar os dois diretórios com o comando diff fazendo:

$ diff <(ls -la dir) <(ls -la dir.bkp) 

O comando diff, cuja entrada só aceita arquivos, receberá a listagem dos dois diretórios como se fossem arquivos (named pipes temporários ou /dev/fd/63), lê-los e compará-los.



Veja a relação completa dos artigos de Júlio Cezar Neves

 

 

Opinião dos Leitores

Julio Neves
12 Mar 2018, 11:52
A explicação é simples:
Veja a substituição de processos a seguir:
$ cat <(echo xxx; sleep 3; echo yyy; sleep 3)
Viu?! O cat não esperou pela conclusão dos comandos entre parênteses, mas foi executado no fim de cada um deles. Isso aconteceu porque estabeleceu-se um pipe temporário/dinâmico e os comandos que estavam sendo executados mandavam para ele as suas saídas, que por sua vez as mandava para a entrada do cat.
Isso significa que os comandos dessa substituição de processos rodaram em paralelo, sincronizando somente nas saídas dos echo com a entrada do cat, exatamente como as threads.
Julio Neves
12 Mar 2018, 09:58
Grande Raul, a substituição de processos prosperou tanto, que no Bash 4.0 criaram o cmd coproc, que trata threads.

Fui ver seu código e ele era inteiramente baseado nesta técnica.

Um abração Raul, vc anda meio sumido da lista de shell
Raul Liborio
11 Mar 2018, 14:58
Mestre Júlio! Recebi essa notificação já tem algum tempo, até que achei um script na web pra migração de bases de dados, e o named pipes era utilizado. Imediatamente lembrei desse artigo, que simplificou como é que aquilo funcionava. Valeu!
Julio
11 Out 2017, 21:49
Valeu Dorian,
Obrigadíssimo pelo elogio ao meu trabalho, mas acho que vc quis dizer que eu mostro o pulo do gato. É verdade, não escondo nada... Mas por baixo dos panos, na atualidade política brasileira, pode ter outra conotação...😂

É brincadeira, não perco a piada de jeito nenhum, principalmente se puder envolver a nata política do mundo, que todos sabemos, se concentra em nosso país.

Valeu Dorian, qq dúvida, sempre às ordens.

Abração
Dorian Bolivar
11 Out 2017, 20:09
Os artigos sobre programação shell do Júlio Cezar Neves são de uma maestria inigualável, especialmente por revelarem o que acontece "por baixo dos panos". Obrigado Júlio e Dicas-L por trazerem esse conteúdo essencial a todo profissional Unix/Linux!
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script