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

wingover Messages postés 21 Statut Membre -  
dubcek Messages postés 19025 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
A voir également:

7 réponses

jipicy Messages postés 41342 Statut Modérateur 4 896
 
Salut,

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

Je viens de tester c'est nickel ;-))
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
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
jipicy Messages postés 41342 Statut Modérateur 4 896 > 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
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
dubcek Messages postés 19025 Date d'inscription   Statut Contributeur Dernière intervention   5 640
 
hello
ne serait-ce pas un cas pour expect ?
0
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
jipicy Messages postés 41342 Statut Modérateur 4 896
 
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
dubcek Messages postés 19025 Date d'inscription   Statut Contributeur Dernière intervention   5 640
 
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