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.