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 -
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
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:
- Changer entrée standard en cours d'exécution
- Changer dns - Guide
- Changer clavier qwerty en azerty - Guide
- Panne tnt en cours aujourd'hui - Guide
- Changer carte graphique - Guide
- Changer extension fichier - Guide
7 réponses
Salut,
Tout est expliqué là, surtout la partie "Utiliser exec".
Je viens de tester c'est nickel ;-))
Tout est expliqué là, surtout la partie "Utiliser exec".
Je viens de tester c'est nickel ;-))
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$;-))
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.
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.
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.
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.
hello
ne serait-ce pas un cas pour expect ?
ne serait-ce pas un cas pour expect ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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... ;-)
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... ;-)
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"
#!/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"