A saída de um comando pode ser canalizada para outros dois comandos?

27

Como canalizar a saída de um comando para a entrada de outros dois comandos simultaneamente?

Richard Hoskins
fonte
4
Sim. Veja esta pergunta sobre o stackoverflow: stackoverflow.com/questions/670784/…
Blair Conrad

Respostas:

56

Parece que o teecomando fará o que você deseja.

A chave é usar

>( )

para substituição de processo . Com tee, use o seguinte padrão:

tee >(proc1) >(proc2) >(proc3) | proc4

Portanto, se você quiser usar a saída lscomo entrada em dois grepprogramas diferentes , salve a saída de cada um grepem arquivos diferentes e canalize todos os resultados less, tente:

ls -A | tee >(grep ^[.] > hidden-files) >(grep -v ^[.] > normal-files) | less

Os resultados do ls -Aserão "canalizados" em ambos os greps. O arquivo hidden-filesterá o conteúdo da saída do primeiro grepe normal-filesos resultados do segundo grep. Todos os arquivos serão mostrados no pager less. EDIT : o que você vê lessé a mesma saída exata de ls -A, não o resultado dos greps. Se você deseja modificar a saída de ls -Apara less, (por exemplo, trocando a ordem para que os arquivos normais sejam listados antes dos ocultos), tente o seguinte:

ls -A | tee >(grep ^[.]) >(grep -v ^[.]) >/dev/null | less

Sem >/dev/null, a saída de greps seria anexada à saída em ls -Avez de substituí-la.

fonte

Ben
fonte
3
esse é muito bom!
hayalci
3
+1 porque, mesmo após 10 anos de script de shell, eu nunca tinha visto isso!
#
6

Use "tee".

Exemplo:

grep someSearchString someFile | tee /dev/tty | wc -l > grepresult

Isso enviará a saída do comando grep para o terminal e para o wc (cuja saída é, por sua vez, redirecionada para o arquivo grepresult).

"Tee" é explicado no artigo da Wikipedia tee (comando) . O ponto central é: "O comando tee lê a entrada padrão, depois grava seu conteúdo na saída padrão e o copia simultaneamente no (s) arquivo (s) ou variáveis ​​especificados".

Peter Mortensen
fonte