IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[BASH] récupérer stdin


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut [BASH] récupérer stdin
    Bonjour j'ai fait un petit script bash pour executer des commandes contenues dans un fichier

    il renvoi les résultats dans un fichier, les erreurs dans un autre

    il est destiné à être lancé par un autre programme (donc la console n'est pas visible)

    seulement j'ai un problème pour toutes les fonctions demandant l'intervention de l'utilisateur(clavier)

    Je ne vois pas comment faire..
    ptre lancer un programme qui renverrai en résultat ce qui est attendu ? mais comment...
    bref je suis coincé, et comme c'est mon premier script j'avoue que je ne vois pas du tout quoi faire...

    je poste mon code si ça peut aider(loin d'être parfait)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #!/bin/bash
    count=-1
    if [ ! -e "$1" ]; then
    	chemin=`pwd`"/"
    elif [ -d "$1" ]; then 
    	chemin="$1"
    fi
    cd ~
    rm "${chemin}results"
    rm "${chemin}erreurs"
    while read line
    do 
    	let "count+=1"
    	echo "=>com$count:" >> "${chemin}results"
    	echo "=>com$count:" >> "${chemin}erreurs"
    eval ${line} 1>>"${chemin}results" 2>>"${chemin}erreurs"
    done < "${chemin}commandes"
    	let "count+=1"
    	echo "=>com$count:" >> "${chemin}results"
    	echo "=>com$count:" >> "${chemin}erreurs"
    eval ${line} 1>>"${chemin}results" 2>>"${chemin}erreurs"
     
    echo "*FIN*" >> "${chemin}results"
    echo "*FIN*" >> "${chemin}erreurs"
    exit 0
    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 731
    Points : 31 054
    Points
    31 054
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par une maison en bois Voir le message
    seulement j'ai un problème pour toutes les fonctions demandant l'intervention de l'utilisateur(clavier)
    Pour résoudre ce genre de problème, t'as deux moyens
    Imaginons que tu veuilles faire un script simple et que, à un moment, tu veuilles une info venue du clavier (par exemple un nom) => on est dans un cas similaire au tien mais plus simple. Donc voici les 2 solutions
    Solution 1) l'info attendue (le nom) est passée en paramètre
    Exemple de ton script nommé "script.sh"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
    ...
    ...
    ... <traitement de $1 qui est le nom attendu>
    ...
    Et tu le lances de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./script.sh le_nom_dont_le_script_a_besoin
    Cette façon de lancer le script peut facilement être intégrée dans ton autre programme

    Solution 2) l'info attendue (le nom) est saisi au clavier mais le clavier est redirigé
    Exemple de ton script nommé "script.sh"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/sh
    ...
    ...
    ... read nom      # Saisie du nom
    ... <traitement de $nom qui est le nom attendu>
    ...
    Et tu peux le lancer ce script de deux façons
    1) par un pipe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "le_nom_dont_le_script_a_besoin" |./script.sh
    2) en redirigeant l'entrée standard en direct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./script.sh << _EOT_
    le_nom_dont_le_script_a_besoin
    _EOT_
    Idem => ces 2 façons de lancer le script peuvent facilement être intégrée dans ton autre programme

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Merci de t'être penché sur mon problème.
    J'ai tenté d'utiliser tes 2 méthodes mais je crois que ça ne convient pas à mon problème (ou je ne trouve pas comment)

    Le problème c'est que je ne sais pas à l'avance quelle vont être les commandes qui vont être exécutées (elles sont contenues dans un fichier texte)
    et donc je ne sais pas lesquelles demandent l'intervention de l'utilisateur ni la réponse nécessaire.

    Donc je ne peux pas lancer mon script en lui donnant une réponse prédéfinie :/

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 731
    Points : 31 054
    Points
    31 054
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par une maison en bois Voir le message
    Le problème c'est que je ne sais pas à l'avance quelle vont être les commandes qui vont être exécutées (elles sont contenues dans un fichier texte)
    Et tu as la maîtrise du fichier texte ou bien il t'arrive depuis ailleurs sans que tu puisses rien faire ???

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Les commandes à exécuter contenues dans le fichier texte
    non je les contrôle pas..
    donc certaines ne nécessitent pas d'intervention de l'utilisateur

    par exemple :
    et là le résultat est enregistré dans un fichier sans problème

    mais si la commande est
    là il faut que l'utilisateur confirme.. et là ça fonctionne plus...
    (je fais abstraction du sudo c'est encore un autre problème)

    donc faudrait que quand une commande demande une réponse.. je puisse la lire d'un fichier ou je ne sais quoi.. mais seulement pour celles-ci mais je n'ai aucun moyen de savoir lesquelles le feront...

    Et en prime il faudrait que je puisse également récupérer ce que renvoie cette commande avant qu'elle attende une réponse (pour savoir ce à quoi il faut donner une réponse)

    voilà

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 731
    Points : 31 054
    Points
    31 054
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par une maison en bois Voir le message
    Les commandes à exécuter contenues dans le fichier texte
    non je les contrôle pas..
    donc certaines ne nécessitent pas d'intervention de l'utilisateur

    par exemple :
    et là le résultat est enregistré dans un fichier sans problème

    mais si la commande est
    là il faut que l'utilisateur confirme.. et là ça fonctionne plus...
    (je fais abstraction du sudo c'est encore un autre problème)

    donc faudrait que quand une commande demande une réponse.. je puisse la lire d'un fichier ou je ne sais quoi.. mais seulement pour celles-ci mais je n'ai aucun moyen de savoir lesquelles le feront...

    Et en prime il faudrait que je puisse également récupérer ce que renvoie cette commande avant qu'elle attende une réponse (pour savoir ce à quoi il faut donner une réponse)

    voilà
    Si tu ne sais pas à l'avance quelles commandes tu vas lancer et parmi elles lesquelles attendent une réponse cela va être très difficile.

    Une solution "bancale" serait que tu commences par lire le fichier que tu reçois ligne par ligne pour créer toi-même un 2° fichier "à ta sauce"
    Tu analyses la ligne lue
    Si la ligne contient une commande que tu attends et qui a besoin d'une réponse, tu écris dans le 2° fichier l'ordre de lancement de la commande avec la réponse attendue
    En fin de traitement, tu exécutes ensuite le 2° fichier

    Exemple: ton fichier initial contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ls ~/
    apt-get remove eclipse
    Alors ton fichier final contient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ls ~/
    apt-get remove eclipse <<_EOT_
    yes
    yes
    _EOT_
    C'est le seul moyen que je vois. Et c'est très bancal car faut que ton filtre connaisse d'avance toutes les commandes que tu es suceptible de trouver...

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Avril 2003
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    :/ je me doutais que c'étais pas franchement faisable.. parce que tout filtré ça ne serait pas possible.

    Du coup je me suis penché sur une solution en C ou C++... mais n'ayant jamais touché à aucun de ces 2 langages j'avance doucement....

    voir mon post : http://www.developpez.net/forums/sho...86#post2637286

    en tout cas merci de t'être penché sur mon problème

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 731
    Points : 31 054
    Points
    31 054
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par une maison en bois Voir le message
    Du coup je me suis penché sur une solution en C ou C++... mais n'ayant jamais touché à aucun de ces 2 langages j'avance doucement....
    Regarde du coté des cours et tutoriels C

Discussions similaires

  1. [bash] Récupérer valeur d'un argument dans boucle for
    Par lamingue dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 26/07/2012, 15h25
  2. [bash] récupérer la première occurence d'une série de digits dans une string
    Par Sherwood51 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 21/05/2011, 16h17
  3. récupérer résultat d'une requête SQL en bash
    Par Milo59000 dans le forum Linux
    Réponses: 10
    Dernier message: 08/09/2008, 10h13
  4. [bash]récupérer un code de retour
    Par GLDavid dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 25/04/2008, 14h16
  5. récupèrer stdin venant d'un pipe
    Par julien.63 dans le forum POSIX
    Réponses: 19
    Dernier message: 13/06/2007, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo