taquigrafía para alimentar el contenido de varios archivos al stdin de un script

20

Digamos que tengo un script llamado script, que lee stdiny escupe algunos resultados en la pantalla.

Si quisiera alimentar el contenido de un archivo, habría escrito:

$ ./script < file1.txt

Pero, ¿qué pasa si quiero alimentar el contenido de los múltiples archivos al script de la misma manera, es posible? Lo mejor que se me ocurrió hasta ahora fue:

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

Que usa dos comandos y crea un archivo temporal. ¿Hay alguna manera de hacer lo mismo pero sin crear el archivo combinado?

0x4B1D
fuente
Cambie a zshy podrá ejecutar cmd <file1 <file2 ... <fileN;)
don_crissti

Respuestas:

20

Puede usar caty una tubería:

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

Su ejemplo, usando una tubería y sin archivo temporal:

join file1.txt file2.txt | ./script
Bruce Ediger
fuente
D'oh Es tan simple que ni siquiera estoy seguro de cómo no me di cuenta. ¡Gracias!
0x4B1D
10
Uso útil del premio gato!
Glenn Jackman
44
@Bruce Ediger: Supongo que estabas señalando una forma de usar joinsin un archivo temporal, pero solo para que quede claro para el lector: cat f1 f2no produce la misma salida quejoin f1 f2
Peter.O
@fred gracias por señalar esto: utilicé joinen mi ejemplo porque estaba jugando con él antes; en realidad, para mi ejemplo, estaba usando cat.
0x4B1D
10

Si no desea usar una tubería, puede usar la redirección de entrada con sustitución de proceso:

./script <(cat file1 file2)
Jonás Braun
fuente
3

Para añadir en la respuesta de @Jonah Braun, si alguna vez necesita agregar salida de proceso en la secuencia de comandos, así, es decir, el archivo podría no encontrarse en el disco, pero se accede a través URLusando curlo una herramienta similar.

Algo como esto podría usarse para obtener stdoutmúltiples procesos y usarlos en un script a través destdin

Este será el script para manejar los contenidos de entrada de multi-input.sh:

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

Ahora pruébalo:

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

Salida:

process 1
process 2
process 3

<()convierte el proceso en un fileuso virtual fdsi lo desea, por lo que <es necesario leerlo. caten sí mismo no lo necesita porque hace lo que hace, concatena archivos, virtuales o reales.

sdkks
fuente