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?

0x4B1D
fonte
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
Bruce Ediger
fonte
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)
Jonah Braun
fonte
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.

sdkks
fonte