Digamos que eu tenha um script chamado script
, que leia stdin
e 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?
bash
shell
scripting
io-redirection
0x4B1D
fonte
fonte
zsh
e você será capaz de corrercmd <file1 <file2 ... <fileN
;)Respostas:
Você pode usar
cat
e um pipe:Seu exemplo, usando um canal, e nenhum arquivo temporário:
fonte
join
sem um arquivo temporário, mas apenas para torná-lo claro para o leitor:cat f1 f2
não produz a mesma saídajoin f1 f2
join
no meu exemplo porque estava brincando com ele antes; na realidade, no meu exemplo, eu estava usandocat
.Se você não quiser usar um canal, poderá usar o redirecionamento de entrada com substituição de processo:
fonte
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
URL
uso decurl
uma ferramenta semelhante.Algo assim poderia ser usado para obter
stdout
vá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
:Agora teste:
Saída:
<()
transforma o processo em um virtualfile
usando,fd
se você preferir,<
é necessário lê-lo.cat
ele próprio não precisa, porque faz o que faz, concatena arquivos, virtuais ou reais.fonte