raccourci pour alimenter le contenu de plusieurs fichiers vers la stdin d'un script

20

Disons que j'ai un script appelé script, qui lit stdinet envoie des résultats à l'écran.

Si je voulais lui donner le contenu d'un fichier, j'aurais tapé:

$ ./script < file1.txt

Mais que se passe-t-il si je veux alimenter de la même manière le contenu de plusieurs fichiers dans le script, est-ce possible? Le meilleur que j'ai trouvé jusqu'à présent était:

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

Qui utilise deux commandes et crée un fichier temporaire. Existe-t-il un moyen de faire la même chose en contournant la création du fichier combiné?

0x4B1D
la source
Passez à zshet vous pourrez exécuter cmd <file1 <file2 ... <fileN;)
don_crissti

Réponses:

20

Vous pouvez utiliser catet un tuyau:

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

Votre exemple, en utilisant un tuyau et aucun fichier temporaire:

join file1.txt file2.txt | ./script
Bruce Ediger
la source
D'oh. C'est tellement simple que je ne sais même pas comment je ne l'ai pas réalisé moi-même. Merci!
0x4B1D
10
Utilisation utile du prix du chat!
glenn jackman
4
@Bruce Ediger: Je suppose que vous indiquiez simplement un moyen d'utiliser joinsans fichier temporaire, mais juste pour être clair pour le lecteur: cat f1 f2ne produit pas la même sortie quejoin f1 f2
Peter.O
@fred merci d'avoir signalé ceci - j'ai utilisé joindans mon exemple parce que je jouais avec auparavant; en réalité, pour mon exemple que j'utilisais cat.
0x4B1D
10

Si vous ne souhaitez pas utiliser de canal, vous pouvez utiliser la redirection d'entrée avec substitution de processus:

./script <(cat file1 file2)
Jonah Braun
la source
3

Pour ajouter la réponse de @Jonah Braun, si vous devez également ajouter une sortie de processus dans votre script, c'est-à-dire que votre fichier peut ne pas être sur votre disque mais accessible via en URLutilisant curlou un outil similaire.

Quelque chose comme ça pourrait être utilisé pour obtenir stdoutplusieurs processus et les utiliser dans un script viastdin

Ce sera le script pour gérer l'entrée Contenu de multi-input.sh:

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

Maintenant testez-le:

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

Production:

process 1
process 2
process 3

<()transforme le processus en une fileutilisation virtuelle fdsi vous le souhaitez, il <est donc nécessaire de le lire. catlui-même n'en a pas besoin car il fait ce qu'il fait, concatène des fichiers, virtuels ou réels.

sdkks
la source