stenografia per alimentare il contenuto di più file nello stdin di uno script


20

Diciamo che ho uno script chiamato script, che legge stdine sputa alcuni risultati sullo schermo.

Se avessi voluto dargli da mangiare il contenuto di un file, avrei digitato:

$ ./script < file1.txt

E se volessi alimentare allo stesso modo il contenuto di più file nello script, è possibile? Il migliore che mi è venuto in mente finora è stato:

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

Che utilizza due comandi e crea un file temporaneo. C'è un modo per fare la stessa cosa ma bypassare la creazione del file combinato?


Passa a zshe sarai in grado di eseguire cmd <file1 <file2 ... <fileN;)
don_crissti

Risposte:


20

Puoi usare cate una pipe:

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

Il tuo esempio, utilizzando una pipe e nessun file temporaneo:

join file1.txt file2.txt | ./script

D'oh. È così semplice che non sono nemmeno sicuro di come non me ne sia reso conto da solo. Grazie!
0x4B1D

10
Uso utile del premio gatto!
Glenn Jackman,

4
@Bruce Ediger: suppongo che stavi solo indicando un modo di usare joinsenza un file temporaneo, ma solo per chiarire al lettore: cat f1 f2non produce lo stesso output dijoin f1 f2
Peter.O

@fred grazie per averlo sottolineato - ho usato joinnel mio esempio perché prima ci giocavo ; in realtà, per il mio esempio che stavo usando cat.
0x4B1D,

10

Se non si desidera utilizzare una pipe, è possibile utilizzare il reindirizzamento dell'input con la sostituzione del processo:

./script <(cat file1 file2)

3

Per aggiungere la risposta di @Jonah Braun, se dovessi mai aggiungere l'output del processo anche nel tuo script, vale a dire che il tuo file potrebbe non essere sul tuo disco ma accedervi URLusando curlo uno strumento simile.

Qualcosa del genere potrebbe essere utilizzato per ottenere stdoutpiù processi e utilizzarli in uno script tramitestdin

Questo sarà lo script per gestire l'input Contenuti di multi-input.sh:

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

Ora provalo:

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

Produzione:

process 1
process 2
process 3

<()trasforma il processo in virtuale fileusando fdse vuoi, quindi <è necessario per leggerlo. catdi per sé non ne ha bisogno perché fa quello che fa, concatena i file, virtuali o reali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.