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

  1. #21
    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
    Bon sang mais c'est bien sûr !
    je l'avais vu passer cette syntaxe du <> (lecture - écriture) mais j'avais pas fait le rapprochement avec mon souci , ballot.
    Merci beaucoup, je vais tester ça mais je sens que c'est résolu.
    Cordialement.

  2. #22
    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
    non, non. ça ne se discute pas : c'est une convention.
    parce qu'on ne connait pas toutes les variables d'environnement, on évite ainsi de les écraser..
    je maintiens que ça peut être sujet à discussion, mais des constantes, des variables exportées, mise en majuscules (dixit), n'est pas forcément une bonne idée pour tous les projets. Cependant j'essaie de lire le Shell Style Guide de Google mais la page ne se charge pas. Je trouve qu'on peut avoir besoin de placer soi-même des variables d'environnement du shell, qui donc se propage partout, dans des cas spécifiques.
    En outre, j'aimerais bien savoir comment lister toutes les variables Bash, du Shell pour éviter les collisions de noms, toutes c'est à dire y compris celles (réservées) qui ne sont pas attribuées dans le shell courant, car sinon, un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "MYTMPFS" < <(env) # check
    suffit à prévenir l'incident.
    Ceci dit je suis bien disposé à me plier aux "conventions" immuables tant que je n'ai pas de bonnes raisons de les outrepasser ^^

  3. #23
    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
    Malheureusement la solution #20 ne fonctionne pas Disedorgue ... même dans un terminal, ça bloque (un truc nous échappe)

  4. #24
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Non, il faut juste respecter:
    - que la dernière ligne insérée finisse bien avec un newline (\n)
    - ne pas fermer le descripteur temps que l'on a pas vidé la fifo

  5. #25
    Invité
    Invité(e)
    Par défaut
    placer soi-même des variables d'environnement du shell, qui donc se propage partout, dans des cas spécifiques
    ah, mais là, ça dépasse le cadre d'un script, on serait dans la configuration de l'environnement.
    C'est autre chose, mais même alors, je ne suis pas convaincu que ce soit une bonne idée de mélanger la personnalisation de son environnement avec le travail encadré de personnes chargées de l'environnement de l'OS*. Donc, "panachage" !

    et, pour prévenir tout incident : "panachage" !

    je ne vais pas vérifier qu'une variable environnement ne porte pas le même nom, à chaque fois que je définis une variable.
    donc (encore) : "panachage" !

    --
    * donc, à moins d'une action concertée pour configurer l'environnement dans le cadre du déploiement d'un programme : "panachageuuh" !

  6. #26
    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
    "panachage" !.."panachageuuh" !
    quels sont donc ces termes usuellement réservés (dans mon environnement) à la concoction d'une mixture à base de houblon et de liquide protogazeux et citronné ?
    NB: je n'aurais pas le toupet de défier un développeur, encore moins une équipe qui me donne à utiliser un si bel outil

    Disedorgue je suis interloqué et circonspect, car j'ai bien une new line à la fin, et je ferme le descripteur correctement il me semble, (j'ai testé en modifiant les exit 1 de la fonction, faits précédés de la fermeture du descripteur) ...

    je vais peut-être un peu dormir ...
    j'arrive à quelques solutions bof (au moins quelque chose) en testant les trucs décrits : ICI mais je peine à saisir le fonctionnement

  7. #27
    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
    Bah un jour je tomberai sur un truc et j'aurai le déclic, laissez tomber.
    En attendant une fonction qui me vide le fichier texte où j'aurais redirigé &1 après l'avoir lu et traité fera très très bien l'affaire

  8. #28
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Moi, ce que je ne comprends pas dans ta démarche de "fainéant", pourquoi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ ! -p fipe ] && mkfifo fipe
    exec {var}>&1
    exec 1>fipe & # esperluette ou il ne me rend jamais la main
    init_stuff test
    exec 1>&$var
    exec {var}>&-
    au lieu d'un simple:
    pour ensuite traiter le fichier fic (pas un fifo)

  9. #29
    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 Dens1 Voir le message
    Bah un jour je tomberai sur un truc et j'aurai le déclic, laissez tomber.
    En attendant une fonction qui me vide le fichier texte où j'aurais redirigé &1 après l'avoir lu et traité fera très très bien l'affaire
    Citation Envoyé par disedorgue Voir le message
    Moi, ce que je ne comprends pas dans ta démarche de "fainéant", pourquoi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ ! -p fipe ] && mkfifo fipe
    exec {var}>&1
    exec 1>fipe & # esperluette ou il ne me rend jamais la main
    init_stuff test
    exec 1>&$var
    exec {var}>&-
    au lieu d'un simple:
    pour ensuite traiter le fichier fic (pas un fifo)
    moi ce que je comprends pas c'est pourquoi tu me paraphrases en plus long en disant que tu comprends pas

    Dommage j'aurais bien aimé comprendre et mettre en application les fifos, ça peut toujours servir mais dans l'attente de tomber sur un exemple qui illustre comment je veux m'en servir (si possible), je me passerai de fifo
    Merci quand même, on apprend, on avance, on avance ;-)

  10. #30
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    Un fifo sert à faire de la communication inter-process, d'où son coté bloquant...

    Voici une autre méthode sans fichier du tout:
    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
    26
    $ fx1 () 
    { 
        for i in {1..10};
        do
            echo bob $i;
        done;
        sync
    }
    $ fx2 () 
    { 
        while read xx; do
            echo "xx=$xx";
        done
    }
    $ fx1 > >(fx2)
    xx=bob 1
    xx=bob 2
    xx=bob 3
    xx=bob 4
    xx=bob 5
    xx=bob 6
    xx=bob 7
    xx=bob 8
    xx=bob 9
    xx=bob 10
    $
    Dans la fonction fx1, le sync final est obligatoire, si tu veux garder un semblant de synchronisation dans l'affichage.
    ou plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ fx1 | fx2
    xx=bob 1
    xx=bob 2
    xx=bob 3
    xx=bob 4
    xx=bob 5
    xx=bob 6
    xx=bob 7
    xx=bob 8
    xx=bob 9
    xx=bob 10
    $
    Donc, dans ton cas, fx1 serait la fonction init_stuff et fx2, celle qui traite l'affichage.

  11. #31
    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
    Bien, j'ai suffisamment avancer pour faire un petit résumé en ce qui concerne mes interrogations du début, zé les choses captées.

    - les tubes nommés je n'en ai pas l'utilité, dans la mesure où c'est pratique pour faire communiquer en entrée - sortie des processus (+des scripts) distincts (pas mon cas). De plus c'est un peu délicat à maîtriser (pour moi) et ça ne comporte pas l'avantage qui m'avait à la base attiré, celui de ne pas être un fichier normal, je veux dire écrits en dur sur le DD. (pour faire communiquer des fonctions entre elles ça ne m'intéresse pas, il y a tout ce qui faut dans le traditionnel je pense).
    Car si je fais transiter les milliers de lignes (puis à force des millions, ... au moins pendant l'écriture du script) je voulais soulager le matériel, à la base. Or c'est un fichier particulier, mais en dur.
    Ce que j'ai compris aussi, j'ai vu la syntaxe (fic étant un fifo), c'est adapté si on veut à la fois lire et écrire dedans par le même processus, sans que le fifo se vide, car sinon la moindre opération sur fic viderait fic.

    - pour ce qui est des redirections je ne jongle pas avec mais j'ai à peu prés capté. Je retiens donc l'usage, puisque ça m'évite de finir mes echo par un pointage vers le fichier où je veux rediriger. Je choisis un simple fichier, mais que je monte en ram, voilà comme ça ça écrit dans la ram, et pas en dur (évidement, en cas de fusible défectueux, ou départ de feu dans l'alimentation, je perds, mais vraiment rien que je ne puisse retrouver).
    J'ai compris un truc intéressant, c'est qu'un simple fichier, dès lors qu'on fait (comme je le montre après dans le détail des modifs du script et des fonctions) un redirection de fd vers lui, se comporte aussi vraisemblablement comme un tampon, un fifo, c'est à dire que la moindre opération sur le fichier vide le fichier, de même que la fermeture du file descriptor auquel il était associé, vide le fichier.

    Donc, j'ai rajouté ces petite choses dans les fichiers script.sh, des_fonctions.sh et des variables.sh (page 1)
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    trap "sync" RETURN EXIT # en tête d'init_stuff
    trap "sync" EXIT # en tête de config_tmpfs
    
    # le script proprement dit qui fonctionne comme je veux
    exec 3>&1 # sauvegarde de stdout dans 3 (ou {var}, sauf que j'ai d'abord testé ainsi, de peur que {var} ne soit pas compris dans la fonction qui le referme 
    exec 1>fic # j'associe stdout à fic (un fichier normal)
    init_stuff "$1" | renvoie_string # envoie du bins dans une foncion de traitement
    
    # le fichier des variables (dsl j'ai pas encore modifié les noms en pachaché d'upper-lowercase hiha)
    export linemodel="Lorem ipsum dolor sit amet, consectetur adipisicing elit, dolor sit amet|ncididunt ut" # le patron, comme on dit en coutûre
    
    # dans les fonctions, renvoie_string devient:
    
    exec 1>&3 # je rétablis stdout, dès lors tout sortira comme avant sur l'écran, le terminal
    
    # ( si je veux écrire "$linemodel ici, ou même avant le rétablissement stdout, je vide le fichier même si j'append (>>)
    # qu'il ne reste que la dernière ligne, linemodel, écrite.
    # echo "$linemodel" >> ou > fic
    # exec 1>&3
    # cat fic  affiche linemodel, et c'est tout )
    
    	while read line; do
                   # préformate ici un peu mais bon ... à la va-vite, je verrai à l'usage
                   # pour ce qui est des couleurs comme je voulais, je le fais en amont, ici j'ai tout le loisir de travailler sur la chaîne
                   # mais il me manque une info pour la première colonne, renvoie_string ignore comment je la voulais (gras, italique, quelle couleur, underline ...) 
    		echo "$line" | sed -e 's/OK/|OK/g' -e 's/NO/|NO/g' -e 's/Echec/|Echec/g' # l'essentiel c'est de diviser les lignes en colonnes à l'aide du séparateur '|'
    	done >> fic1 # mais je copie tout ça dans un fichier normal
    	
    	echo "$linemodel" >> fic1 # là je peux ajouter le model de formatage sans tout effacer (autre fichier normal)
    
    	column -t -s '|' fic1 # et là column fonctionne nickel (pas de message "column too long" à cause d'une echo -n en amont)
    	# je peux envoyer column dans une boucle while read line pour temporiser l'affichage, pour le confort des yeux (parce que là ça défile vitesse pas humaine quoi).
    	exec 3>&- # et je ferme le descripteur.
    Je ferme pour l'exemple, mais en fait pour éviter de le réouvrir dans le script, et vu que fic est maintenant vide, je pourrais me contenter de remettre stdout > fic en fin de fonction, pour la suite.

    Voilà voilà, merci à vous pour vos éclaircissement, comme quoi on part de "tiens j'afficherais bien cette ligne en blanc, celle là en rouge, pour voir les étapes qui couinent ..." et on explore les fifos, les redirections, les fd, column, sync (sync je ne suis pas certain que ce soit utile ici, à voir à l'usage quand ça va se corser en terme de tâches et de volume d'affichage), les LS_COLORS, etc ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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