Script: execution de commande par un logiciel

Résolu
in_die Messages postés 52 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

je souhaite écrire un script qui lance un logiciel, puis fait executer des commandes à mon logiciel, typiquement
evolver monfichier (mon logiciel)
gogo (la commande du logiciel)

mais je n'arrive pas à trouver la formulation en langage shell, car mon logiciel est lancé et ensuite je dois taper moi meme mes commandes.
Pouvez vous m'aider?

Merci :)

2 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    essayer
    evolver monfichier  <<EOF
    gogo
    autres commandes
    quit
    EOF
    1
    1. in_die Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
       
      Oui merci, mais EOF fait quitter mon script à la fin, alors que j'ai besoin de rester dans le script pour reouvrir un autre fichier evolver et continuer à lancer d'autres commandes.
      0
    2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      En théorie non.

      Exemple :

      #!/bin/sh
      echo "1"
      cat << EOF
      bonjour
      comment ça va ?
      EOF
      echo "2"
      exit 0


      ... donne à l'exécution :

      1
      bonjour
      comment ça va ?
      2


      Peut-être que tu es en mode
      set -e
      et qu'evolver retourne un code d'exécution différent de 0 ?
      https://stackoverflow.com/questions/4381618/exit-a-script-on-error

      Bonne chance
      0
    3. in_die Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
       
      Ha oui effectivement ca marche!
      j'avais un bug dans ma syntaxe conditionnelle (faire attention aux espaces...)

      Merci :)
      0
    4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      J'en déduis que ton problème est résolu ? Si oui, un petit résumé de ta solution sera sans doute apprécié par les personnes qui pourraient être confrontées au même problème ;-)
      0
    5. in_die Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
       
      Oui problème résolu.

      J'ai utilisé une redirection EOF pour éviter d'avoir un fichier supplémentaire contenant commandes. Comme je voulais intérargir avec l'utilisateur et utiliser la valeur choisie dans les procédures evolver, j'ai bricolé un truc du style:


      #!/bin/sh

      echo "Voulez-vous 5 ou 10?"
      read macst

      if [ $macst -eq 5 ]
      then
      evolver fichier.fe << EOF
      command1
      cst:=5
      command2
      EOF
      else
      evolver fichier.fe << EOF
      command3
      cst:=10
      command4
      EOF
      fi
      0
  2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    Bonjour,

    Je n'ai pas très bien compris de quel logiciel, et s'il s'agissait ou nom d'un logiciel en ligne de commande. Qu'est ce que "gogo" ?

    Si le programme est un programme en mode texte

    En shell tu peux pour un programme qui demande des lignes de commandes, lui injecter ce que tu aurais tapé avec un clavier via un fichier d'entrée.

    Prenons un exemple concret, supposons que ton logiciel soit par exemple ce petit programme (que je vais nommer toto.sh) :

    #!/bin/sh
    
    echo "x? "
    read x
    echo "y? "
    read y
    
    echo "x = $x y = $y"
    exit 0


    Si j'exécute toto.sh on me demande bien de saisir les valeurs de x et y :

    (mando@velvet) (~) $ sh toto.sh 
    x?
    plop
    y?
    pouet
    x = plop y = pouet


    Supposons maintenant que je veuille automatiser ma saisie en pré-replissant ce que je vais taper à ce programme dans un fichier (mettons toto.txt). La première ligne correspondra à la première saisie, la seconde à la deuxième saisie, etc.

    (mando@velvet) (~) $ echo "plip" > toto.txt
    (mando@velvet) (~) $ echo "plap" >> toto.txt
    (mando@velvet) (~) $ cat toto.txt
    plip
    plap


    Ok mon fichier est prêt, voyons comment l'injecter dans toto.sh :

    (mando@velvet) (~) $ sh toto.sh < toto.txt 
    x?
    y?
    x = plip y = plap


    Si le programme a une interface graphique

    Idéalement ton programme graphique ne fait qu'envelopper une librairie, qui est met aussi à disposition une API shell (voir partie précédente) qu'on peut scripter. Ce serait par exemple le cas d'APT : scripter la logithèque c'est difficile, écrire un script shell avec des commandes apt qui vont bien, c'est facile.

    Autre cas possible, ton programme ne fait qu'instrumenter une librairie. Dans ce cas écrire ton programme revient juste à appeler les bonnes fonctions de cette librairie, avec les bons paramètres et dans le bon ordre.

    Si rien de tout ça n'est possible, c'est plus compliqué. Il reste possible de scripter tes périhpériques (par exemple ta souris) pour imiter ce qu'un humain ferait :
    https://linuxformat.com

    Il faut alors lancer le programme en arrière plan (par exemple
    ./toto &
    ) et espérer qu'un humain ne s'amuse pas à perturber la souris ou le clavier pendant l'exécution de ton script.

    Bonne chance
    0
    1. in_die Messages postés 52 Date d'inscription   Statut Membre Dernière intervention  
       
      Oui c'est bien comme ca, sauf que maintenant j'aimerais faire la même chose sans utiliser de fichier intermédiaire (j'ai beaucoup de fichiers pour faire toutes la procédure), c'est à dire écrire mes commandes directement dans mon script, est ce que c'est possible?

      J'ai tenté avec EOF mais mon script s'arrête après le second EOF.
      0