GNU/Linux >> Tutoriels Linux >  >> Linux

Automatisation de la saisie textuelle à partir d'un script bash sans utiliser EOF

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.


Linux
  1. Pipe vers/depuis le presse-papiers dans le script Bash

  2. Exécuter le script bash à partir de l'URL

  3. Automatisation de la commande en cours d'exécution sur Linux à partir de Windows à l'aide de PuTTY

  4. automatiser la session telnet à l'aide de scripts bash

  5. Transférer des fichiers en utilisant lftp dans un script bash

Empêcher un script bash de s'exécuter simultanément

Script Bash pour supprimer le fichier le plus ancien d'un dossier ?

Option Rsync inconnue à partir de l'exécution du script Bash ?

Comment savoir si je suis dans une session Tmux à partir d'un script bash ?

Comment vérifier la syntaxe d'un script Bash sans l'exécuter ?

Comment ajouter un travail crontab à crontab à l'aide d'un script bash ?