Pour presque tous les programmes, à la fois echo $i | myprogram -options
et myprogram -options <<<$i
devrait fonctionner, en alimentant le programme $i
via la saisie standard.
<foo
utilisera le contenu du fichier nommé foo
comme stdin.
<<foo
utilisera le texte entre cela et une ligne composée uniquement de foo
comme entrée standard. Ceci est un document ici (heredoc), comme disait Gilles; EOF
ne signifie pas réellement la fin du fichier, c'est juste un délinéateur heredoc commun (nous utilisons "foo" à la place dans cet exemple).
<<<foo
utilisera la chaîne "foo" comme entrée standard. Vous pouvez également spécifier une variable $foo
, et le shell utilisera son contenu comme stdin, comme je l'ai montré ci-dessus. C'est ce qu'on appelle un herestring , car il utilise une chaîne courte contrairement à un bloc entier, comme dans un heredoc. Herestrings fonctionne en bash, mais pas en /bin/sh
.
La syntaxe recommandée par ce site Web s'appelle un document ici. L'entrée dans le programme de fichier commence immédiatement sous la ligne contenant <<EOF
, et il ne se termine pas par la fin du script, mais par une ligne contenant exactement le texte EOF
(veillez à ne pas avoir d'espace blanc supplémentaire). Au fait, vous pouvez utiliser n'importe quel marqueur de fin qui ne contient aucun caractère spécial du shell :EOF
n'est pas un mot-clé, c'est simplement traditionnel.
#!/bin/bash
for i in {1..100}
do
myprogram -options <<EOF
$i
EOF
for j in {1..42}; do
myprogram2 <<EOF
$i
$j
EOF
done
done
ici les documents mentionnés par Kevin et Gilles ci-dessus, ou une simple tuyauterie fonctionnera dans de nombreux cas.
Pour des situations plus compliquées, vous voudrez peut-être regarder dans Expect ou similaire (par exemple, le module Expect::Simple CPAN est une implémentation perl très facile à utiliser). personnellement, je préfère le module perl (Expect lui-même est tcl) mais il existe des implémentations pour de nombreux langages de script courants. Il est même possible d'écrire un très implémentation primitive de l'idée dans sh ou bash en utilisant while et read.
L'idée générale d'Expect et d'outils similaires est d'attendre une chaîne ou un modèle spécifié dans la sortie d'un programme, puis de lui fournir l'entrée souhaitée.
Un exemple d'utilisation courant consiste à automatiser la connexion, en "attendant" (c'est-à-dire en attendant) la chaîne "ogin :", en envoyant le nom de connexion, puis en attendant la chaîne "mot :" et en envoyant le mot de passe.
Une dernière option, si vous avez la source de myprogram, consiste simplement à la modifier pour prendre l'entrée que vous voulez lui donner comme option de ligne de commande. Cela peut être un peu plus de travail au départ, mais ce sera beaucoup moins agaçant que de jouer avec Expect ou de canaliser des données dans un programme qui n'a pas été conçu pour être utilisé de cette façon.
... et n'oubliez pas de soumettre votre patch à myprogram en amont :) Même s'ils n'aiment pas la façon dont vous l'avez codé, ils pourraient assez aimer l'idée pour ajouter la fonctionnalité eux-mêmes. Les développeurs en amont ont tendance à apprécier les personnes qui se lâchent et contribuent plutôt que d'exiger ou de se plaindre.