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

15

Digamos que eu tenha um script chamado script , que leia stdin e envie alguns resultados para a 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, é possível? O melhor que cheguei 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?

    
por 0x4B1D 08.09.2011 / 02:49

3 respostas

17

Você pode usar cat e um canal:

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

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

join file1.txt file2.txt | ./script
    
por 08.09.2011 / 03:03
7

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

./script <(cat file1 file2)
    
por 20.11.2017 / 15:25
0

Para adicionar a resposta da @Jonah Braun, se você precisar adicionar a saída do processo ao seu script, ou seja, seu arquivo pode não estar no seu disco, mas acessado via URL usando curl ou uma ferramenta semelhante. / p>

Algo parecido com isso pode ser usado para obter stdout de vários processos e usá-los em um script por meio de stdin

Este será o script para lidar com entrada Conteúdo 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 file virtual usando fd , se preferir, por isso < é necessário para lê-lo. cat em si não precisa disso porque faz o que faz, concatena arquivos, virtuais ou reais.

    
por 02.09.2018 / 07:41