você está aqui: Home  → Colunistas  →  Cantinho do Shell

 

Substituio de Processos

Colaborao: Jlio Neves

Hoje vou mostrar que o Shell tambm usa os named pipes de uma maneira bastante singular, que a substituio de processos (process substitution). Uma substituio de processos ocorre quando voc pe um < ou um > grudado na frente do parntese da esquerda. Teclando-se o comando:

  $ cat <(ls -l)

Resultar no comando ls -l executado em um subshell como normal, porm redirecionar a sada para um named pipe temporrio, que o Shell cria, nomeia e depois remove. Ento o cat ter um nome de arquivo vlido para ler (que ser este named pipe e cujo dispositivo lgico associado /dev/fd/63), e teremos a mesma sada que a gerada pela listagem do ls -l, porm dando um ou mais passos que o usual.

Como poderemos constatar isso? Fcil... Veja o comando a seguir:

  $ ls -l >(cat)
  l-wx------ 1 jneves jneves 64 Aug 27 12:26 /dev/fd/63 -> pipe:[7050]

... Realmente um named pipe.

Voc deve estar pensando que isto uma maluquice de nerd, n? Ento suponha que voc tenha 2 diretrios: dir e dir.bkp e deseja saber se os dois esto iguais (aquela velha dvida: ser que meu backup est atualizado?). Basta comparar os dados dos arquivos dos diretrios com o comando cmp, fazendo:

  $ cmp <(cat dir/*) <(cat dir.bkp/*) || echo backup furado

ou, melhor ainda:

  $ cmp <(cat dir/*) <(cat dir.bkp/*) >/dev/null || echo backup furado

Este um exemplo meramente didtico, mas so tantos os comandos que produzem mais de uma linha de sada, que serve como guia para outros. Eu quero gerar uma listagem dos meus arquivos, numerando-os e ao final dar o total de arquivos do diretrio corrente:

  while read arq
  do
      ((i++)) # assim nao eh necessario inicializar i
      echo "$i: $arq"
  done < <(ls)
  echo "No diretorio corrente (``pwd``) existem $i arquivos"

T legal, eu sei que existem outras formas de executar a mesma tarefa. Mas tente fazer usando while, sem usar substituio de processos que voc ver que este mtodo muito melhor.

//Publicado originalmente na Dicas-L em 22 de fevereiro de 2005

Duvidas? <julio neves (a) gmail com>
Deseja fazer curso de Programao em Shell? <julio neves (a) tecnohall com br>

Conhea tambm o livro de Programao Shell de Jlio Neves

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!

Veja a relação completa dos artigos desta coluna