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