Changer entrée standard en cours d'exécution

wingover Messages postés 21 Statut Membre -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Voici mon problème: J'exécute depuis le shell un programme (écrit en fortran et compilé) qui attend des entrées utilisateur, donc lues depuis le clavier, et exécute une opération en fonction de l'entrée. Lorsque l'opération est terminée il attend une nouvelle entrée et exécute ensuite une nouvelle opération, et ainsi de suite.

Or j'utilise souvent ce programme et il se trouve que la première séquence d'entrées est souvent identique. Alors pour gagner du temps je cherche à écrire un script qui exécute le programme, entre la première séquence de commande puis me redonne la main. J'ai donc essayé une commande du genre:

echo "1/n22/naaa" | programme

En espérant que "programme" soit exécuté puis que la séquence suivante lui soit envoyée:
1
22
aaa


Ce qui fonctionne effectivement, sauf que pour la quatrième commande je ne suis plus sollicité au clavier et le programme plante avec un "runtime error" lié semble-t il a l'entré standard.

Comment faire alors pour rebrancher l'entrée standard sur le clavier une fois que ma séquence est terminée (et donc en cours d'éxécution de "programme") ?

Merci d'avance pour votre aide.

Un petit problème subsidaire : en admettant qu'il existe une solution a mon problème, peut on alors envisager une version plus complexe où on exécuterai successivement des séquences prédéfinies tout en sollicitant l'utilisateur au clavier entre ces séquences ? Par exemple:
Le programme est exécuté, il reçoit la séquence :
1
22
aaa

La quatrième entrée doit être lue depuis le clavier puis nouvelle séquence
2
33
bbb

Les entrées 8 et 9 sont à nouveau lues depuis le clavier, etc.

NOTE: On ne peut évidement pas toucher au code du programme en fortran, tout doit être fait depuis le shell.

Merci pour votre aide.

Stéphane
Configuration: Windows 2000
Internet Explorer 6.0

7 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Tout est expliqué , surtout la partie "Utiliser exec".

    Je viens de tester c'est nickel ;-))
    0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    jp@MDK:~/tmpfs ssh$ cat foo.sh     # le script
    #! /bin/bash
    
    exec 6<&0
    exec < fichier
    read -p "Nom : " nom
    read -p "Prenom : " prenom
    read -p "Age : " age
    exec 0<&6
    read -p "Ville :" ville
    
    echo
    echo "Nom = $nom
    Prenom = $prenom
    Age = $age
    Ville = $ville"
    
    jp@MDK:~/tmpfs ssh$ cat fichier     # le fichier de réponses
    Dupond
    Lajoie
    20ans
    
    jp@MDK:~/tmpfs ssh$ ./foo.sh
    Ville :Ploucville     # Entrée au clavier
    
    Nom = Dupond
    Prenom = Lajoie
    Age = 20ans
    Ville = Ploucville
    
    jp@MDK:~/tmpfs ssh$
    ;-))
    0
    1. wingover Messages postés 21 Statut Membre
       
      Merci pour ton aide mais ça ne solutionne pas mon problème !
      En effet utiliser la commande exec pour envoyer un fichier sur l'entrée standard revient il me semble au même que utiliser un pipe comme je l'avais fait dans mon premier message.
      En revanche il faut là encore ajouter une commande pour rebrancher le clavier sur l'entrée standard au milieu de l'exécution, ce que je ne peux pas faire puisque mon programme est en cours d'exécution.

      Je m'explique, dans la solution que tu proposes, tu fais:
      >Redirection de clavier vers &6 pour sauvegarde
      >Branchement de "fichier" sur &0 (clavier)
      >Lecture de deux lignes (a fortiori dans "fichier")
      >Branchement de &6 sur &0 pour rebrancher clavier sur entrée standard
      >Lecture de lignes au clavier.

      Ceci nécessite de pouvoir insérer la commande qui switch entre clavier et fichier au bon endroit, ce que je ne peux justement pas faire puisque mon programme est en cours d'exécution.
      Il faudrait plutôt que je puisse faire quelque chose comme ça:
      >Brancher "fichier" sur &0 mais lorsque eof "fichier" alors rebrancher clavier sur &0
      >Execution de "programme" qui lit dans fichier puis au clavier dés que la fin de fichier est atteinte.
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > wingover Messages postés 21 Statut Membre
         
        Ben là honnêtement je ne vois pas sans que cela soit implicitement fait par le programme père ;-((
        0
  3. wingover Messages postés 21 Statut Membre
     
    Ok.
    Il n'y a donc pas pas moyen de bluffer un programme sur les N premières commandes en lui faisant lire un fichier puis de retourner à la normale en lui faisant lire au clavier sans modifier le programme lui même ?
    Bon merci pour ton aide en tous cas.
    0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    ne serait-ce pas un cas pour expect ?
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Pas bête ça, mais je vois toujours pas comment switcher entre de l'interactif et de l'automatique sans que le programme principal ne soit programmé pour !?

      Parce que même expect, c'est soit automatisé, soit interactif, soit les deux (auto puis interact) mais le contraire ;-(
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. wingover Messages postés 21 Statut Membre
     
    Et ne serait-il pas possible d'écrire du texte dans le fichier stdin avant d'exécuter le programme de façon à ce que lorsque le programme est lancé il avale ces lignes comme si elles avaient été tapées instantanément au clavier puis il attende la suite (toujours au clavier) ?

    Nb: Le fonctionnement de ces fichiers d'entrées sorties n'est pas encore limpide pour moi, donc c'est juste une idée comme ça mais peut être que ça n'a pas de sens.
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Il faudrait peut être voir du côté des tubes nommés (fifo).

    Ecrire un fichier de réponses du style :

    data1
    data2
    data3
    EOF
    EOF
    data4
    data5
    EOF
    data6
    EOF
    EOF
    EOF
    data8
    etc.

    lire ce fichier avec "exec" mais auparavant le filtrer en l'envoyant dans un fifo (en lecture/écriture), vérifier son contenu (si != EOF), et en fonction du résultat, lire depuis le clavier ou le fichier à l'aide d'une fonction.

    Je ne sais pas si j'ai été clair sur ce coup et si c'est faisable, mais c'est une idée comme une autre... ;-)
    0
  8. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    avec expect, je ferais quelque chose comme ça, mais je ne peux pas tester

    #!/usr/bin/expect
    spawn prog
    expect "question 1"
    send "reponse1\n"
    expect "question 2"
    send "reponse2\n"
    expect "question 3"
    send "reponse3\n"

    send_user "question 4"
    expect_user -re "(.*)\n"
    send_user "\n"
    set reponse4 $expect_out(1,string)
    send "$reponse4\n"
    0