Dire que j'ai une commande foo
qui prend un argument de nom de fichier: foo myfile.txt
. Chose ennuyeuse, foo
ne lit pas depuis l'entrée standard. Au lieu d'un fichier réel, je voudrais lui transmettre le résultat d'une autre commande (en réalité pv
, qui cat le fichier et produira un indicateur de progression comme effet secondaire).
Y a-t-il un moyen d'y arriver? Rien dans mon sac de trucs ne semble le faire.
( foo
dans ce cas, c'est un script PHP qui, je crois, traite le fichier de manière séquentielle).
J'utilise Ubuntu et Bash
EDIT Désolé pour la description du problème légèrement floue, mais voici la réponse qui fait ce que je veux:
pv longfile.txt | foo /dev/stdin
Très évident maintenant que je le vois.
Réponses:
Si je comprends bien ce que vous voulez faire correctement, vous pouvez le faire avec la fonction de substitution de commandes de bash:
Cela fait quelque chose de similaire à ce que les
mkfifo
réponses basées suggèrent, sauf que bash gère les détails pour vous (et il finit par passer quelque chose comme / dev / fd / 63 à la commande, plutôt qu'un canal nommé normal). Vous pouvez également le faire encore plus directement comme ceci:la source
pv inputfile.txt | foo /dev/stdin
exactement ce que je cherchais, mais je n'y ai pas pensé.<(.)
travaillé pour moi. Cette syntaxe est-elle documentée dans le manuel de Bash? Je comprends(.)
que la substitution de commandes est documentée, mais je n'ai pas vu sa combinaison avec<
expliquée.mkfifo
.la source
Cette question Unix SE a une réponse qui montre comment créer un canal nommé temporaire:
Shell Script mktemp, quelle est la meilleure méthode pour créer un canal nommé temporaire?
En vous basant sur les réponses, vous pourriez faire quelque chose comme ceci:
Vous pourrez alors regarder la pipe avec:
Ensuite, supprimez-le lorsque vous avez terminé.
la source
Essayez d'utiliser mkfifo.
Dans un autre shell, exécutez foo file_read_by_foo
la source
xargs
semble bien fonctionner pour cela:la source
pv
plusieurs fois, chacun avec une ou plusieurs lignes tirées delongfile.txt
. Pas du tout ce que je recherche ici.