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

Shell et commandes GNU Discussion :

Problème redirection et descripteurs de fichier, et 'exec', et même fifo


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut Problème redirection et descripteurs de fichier, et 'exec', et même fifo
    Bonsoir,

    j'ai vraiment du mal à comprendre comment fonctionne les redirections, en dehors du basique > 2>&1 ça se corse.

    Dans une fonction, qui déroule des étapes, je veux que soit redirigé stdout vers un fichier (que ce soit fifo ou pas, pour l'instant peu importe).
    À la fin de cette fonction, j'imagine rétablir stdout dans le descripteur dédié: 1
    je voyais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function une {
        # début de fonction
        exec 3>&1 # sauvegarde de 1 dans 3 nouvellement créé
        exec > fic # ou "$fic_version_variable" 
        # là, le moindre echo devrait aller dans fic
        echo "mais comment ça marche ?!"
        echo "tout est tellement puissant en prog, mais en bourne shell aussi pas mal ... si on maîtrise"
        # ci-dessous fin de fonction
        exec 1>&3 # récupère 1 à partir de &3
        exec 3>&- # ferme &3
        # fin de l'histoire,  ressort sur le terminal et pas dans fic !
        echo "bingo ?"
    }
    Je voudrais déjà être sûr d'avoir bien compris qu'en théorie, cette syntaxe là fonctionne, qu'elle veut bien dire ce que j'ai compris qu'elle disait.

    Après j'approfondirai parce que je ne fais pas de simple echo, j'envoie une chaîne dans une autre fonction, et en plus idéalement dans un fichier fifo. (Et je me demande si les exec se répercutent dans la fonction appelée (une fonction deux) de par les exec (redirections) exécuter dans la fonction mère ou pas, mais d'abord, tel quel est ce que ça doit fonctionner ?).

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    il manque un exec à la première redirection.
    après...
    je n'ai pas approfondi les redirections, mais ça me semble correct.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    il manque un exec à la première redirection.
    après...
    Au temps pour moi, je rectifie, je l'ai oublié; il y est dans ma fonction, ça commence par exec.

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Difficile de voir l’intérêt de faire ça...

    C'est juste pour l'exercice ou c'est pour un cas réel (dans ce cas détail bien ton besoin) ?

    car tu peux très bien appeler ta fonction en redirigeant le std(in,out,err) et dans ce cas pas besoin d'une telle moulinette.

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    j'ai pensé à une fonction appelée plusieurs fois, à des endroits différents d'un script...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    je ne proposais pas une solution.
    je répondais au questionnement de disedorgue quant à l'utilité de la manip'.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre éclairé
    Homme Profil pro
    sans
    Inscrit en
    Juillet 2019
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Juillet 2019
    Messages : 141
    Par défaut
    bonsoir,
    et bien je voulais (évidemment on peut faire beaucoup plus simple) à la base une fonction init qui va me checker, me créer, l'espace de travail. Comme il y a différentes étapes j'envoie des echos au fur et à mesure de celle ci, soit ça défile à l'écran en temps réel, soit en différé, capté dans un fichier qui me restitue le check/config des étapes.
    Un peu comme quand on fait un make où il y a des tas de trucs à vérifier, et où ça défile à l'écran avec des OK ou des Echec pour cloturer chaque ligne.

    En plus ces lignes je veux les justifier, (donc prise de tête avec `column` je veux que les "ok" et les "No" (en rouge en plus) soient alignés. Voilà je me demande comment faire, c'est tout. (pour ce qui est de colors, c'est bon, justifier j'y arrive avec une chaîne "patron" de la taille de mes colonnes (avec un délimiteur défini) et un pti sed pour éliminer la ligne modèle etc ça roule.
    Je voudrais juste que quand je dis stdout part dans ce fichier , et stdout revient, puis je lis le fichier, ça sorte comme je souhaite, juste ça à la base, que ça se porte d'une fonction à l'autre. Maintenant si la fonction fille est un processus à part qui a sa sortie en &1, dans l'ignorance de ce que dit la fonction une qui a dit que stdout jusqu'à nouvel ordre c'est fic, j'envisage pourquoi ça marche pas comme je veux.

    Bref en clair, si vous avez une methode pour justifer en temps réel une ligne (label, intitulé de la commande en cours) sans retour à la ligne (!), puis un "ok" ou "no" en fin de cette ligne rajouté en fin d'exécution de la commande (+\n) et ainsi de suit (mettons 20 commandes) toutes alignées pareil , je suis preneur grave

    Du coup, j'imaginais (de fil en aiguille) diriger &1 vers un fifo. La fonction écrit dedans, tout au long du déroulement, puis quand je sors de la fonction en aillant remis les descripteurs tels quels, dans le script là où j'ai appelé init(), je lis ligne par ligne le fifo, un truc dans le genre (c'est en différé, mais j'ai pas encore trouvé mieux).

    ou alors je (ça j'y suis arrivé) , chaque fois que je vais un echo, je > une ligne modèle (au début par exemple, parce que column traite des fichiers terminés, sans possibilité de spécifier un largeur et un nombre de colonne, hyper dommage) dans le fichier, suivie de la ligne "label de la commande/intitulé" sans retour à la ligne, puis le résultat de la commande "ok ou "no", et ensuite je fais column sur le fichier (column prend comme "patron" la ligne la plus longue) et je zappe cette ligne modèle à la sortie. Ou paste j'ai vu, avec plusieurs fichiers, pas encore exploré, pas adéquat.

    Faudrait que je vois comment c'est écrit un script make avec les lignes qui défilent et le résultat de la commande ... Mais il y a tellement de choses à voir non ? que .... je pensais poser une question simple sauf pour moi ^^

    un des buts de la redirection étant qu'elle dure pendant un temps, pour pas avoir à écrire en fin de chaque écho : >> fic (pénible) si en 2 ou 3 exec c'est réglé

    Citation Envoyé par N_BaH Voir le message
    j'ai pensé à une fonction appelée plusieurs fois, à des endroits différents d'un script...
    effectivement j'ai fait ça aussi, en tout cas j'ai pas poussé, pensant à plus simple (or je m'enlise) mais ça marche aussi, mais pas super adapté pour moi sur ce coup. Ça veut dire appeler la fonction (ou qui s'appelle elle-même selon une liste de tâches à faire, mais je ne veux pas d'interruption si une chose échoue, je veux la liste de ce qui a échoué et des ok.).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème redirection dans un fichier txt
    Par kamino62 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 07/06/2012, 18h37
  2. Réponses: 2
    Dernier message: 28/04/2004, 11h25
  3. problème d'acces concurentiel à un fichier
    Par Theoden dans le forum MFC
    Réponses: 2
    Dernier message: 04/03/2004, 09h49
  4. Problème d'E.S. sur fichier avec open
    Par Bubonik software dans le forum C
    Réponses: 6
    Dernier message: 04/02/2004, 19h42
  5. Descripteur de fichier
    Par Zazeglu dans le forum C
    Réponses: 22
    Dernier message: 15/09/2003, 19h45

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