atalho para alimentar o conteúdo de vários arquivos no stdin de um script


20

Digamos que eu tenha um script chamado script, que leia stdine solte alguns resultados na tela.

Se eu quisesse alimentar o conteúdo de um arquivo, eu teria digitado:

$ ./script < file1.txt

Mas e se eu quiser alimentar o conteúdo dos vários arquivos para o script da mesma maneira, isso é possível? O melhor que eu criei até agora foi:

cat file1.txt file2.txt > combined.txt && ./script < combined.txt

Que usa dois comandos e cria um arquivo temporário. Existe uma maneira de fazer a mesma coisa, mas ignorando a criação do arquivo combinado?


Mudar para zshe você será capaz de correr cmd <file1 <file2 ... <fileN;)
don_crissti

Respostas:


20

Você pode usar cate um pipe:

cat file1 file2 file3 ... fileN | ./script

Seu exemplo, usando um canal, e nenhum arquivo temporário:

join file1.txt file2.txt | ./script

D'oh. É tão simples que nem tenho certeza de como não percebi isso sozinho. Obrigado!
0x4B1D

10
Uso útil do prêmio gato!
Glenn Jackman

4
@Bruce Ediger: Eu suponho que você estava apenas apontando uma maneira de usar joinsem um arquivo temporário, mas apenas para torná-lo claro para o leitor: cat f1 f2não produz a mesma saídajoin f1 f2
Peter.O

@ fred, obrigado por apontar isso - usei joinno meu exemplo porque estava brincando com ele antes; na realidade, no meu exemplo, eu estava usando cat.
0x4B1D

10

Se você não quiser usar um canal, poderá usar o redirecionamento de entrada com substituição de processo:

./script <(cat file1 file2)

3

Para adicionar a resposta de @Jonah Braun, se você precisar adicionar também a saída do processo ao seu script, ou seja, seu arquivo pode não estar no seu disco, mas acessado através do URLuso de curluma ferramenta semelhante.

Algo assim poderia ser usado para obter stdoutvários processos e usá-los em um script viastdin

Este será o script para lidar com o conteúdo de entrada de multi-input.sh:

#!/usr/bin/env bash
while read line; do
    echo $line
done

Agora teste:

$ ./multi-input.sh < <(cat <(echo process 1) <(echo process 2) <(echo process 3))

Saída:

process 1
process 2
process 3

<()transforma o processo em um virtual fileusando, fdse você preferir, <é necessário lê-lo. catele próprio não precisa, porque faz o que faz, concatena arquivos, virtuais ou reais.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.