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. #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 730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    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.

  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 419
    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 419
    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 730
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    j'ai pensé à une fonction appelée plusieurs fois, à des endroits différents d'un script...

  6. #6
    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.).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    je ne proposais pas une solution.
    je répondais au questionnement de disedorgue quant à l'utilité de la manip'.

  8. #8
    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
    entre parenthèses, j'aurais plus vite fait de "décompiler" un script typique pour voir comment c'est fait, que de chercher dans tous les sens (je parle pas de chercher votre aide, ça ça a un sens). Mais j'ai bien exploré avant et de fil encore en aiguille on découvre des trucs supers, passionnant, mais éloignent peut-être du centre, de l'objectif.
    je cherchais à "décompiler" et j'ai trouvé shm (?) qui ne fait que compiler, pourtant dans mes souvenirs il y avait une commande un pgk un deb pour rendre humain à l'oeil un binaire (j'ai pas trouvé ce matin).
    Ma question porte sur les redirections comme exposée au début, mais comme j'ai développé, je veux bien entendre la solution qui fait le bilan en tant réel des commandes et leurs statut, c'est clair, cette fonction n'est qu'un détail, je peux m'en passer (tout en silence echec ou ok bastan exit ou ready for the next).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    tu t'égares, là.

    le sujet porte sur les redirections.

    après test, si on ne définit pas de variable globale dans la fonction, on peut simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFonc() (exec 1>monFichier.stdout; echo "bla bla")
    la fonction étant exécutée dans un sous-shell, la redirection n'altérera pas l'environnement courant (le scriptt).

  10. #10
    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
    C'est un peu simpliste. Comment faire ça, j'avais capté. On me demande de développer ce que je veux précisément, je développe, mais à la base, ma question porte bien sur les redirections, vers un fichier, (c'est la première brique et c'est celle là que je pose) tout au long d'une fonction, rétablissement des descripteurs,( et affichage du tampon mais ça c'est un autre sujet ok)

    nb: tu fais une fonction avec ()() au lieu de () { } ? j'ignorais. Je sais que () c'est un sous-shell, je croyais que { } ça n'étais pas tout à fait pareil.

    Citation Envoyé par N_BaH Voir le message
    après test, si on ne définit pas de variable globale dans la fonction, on peut simplifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maFonc() (exec 1>monFichier.stdout; echo "bla bla")
    la fonction étant exécutée dans un sous-shell, la redirection n'altérera pas l'environnement courant (le scriptt).
    mais justement il y a des variables globales, et ça m'arrange qu'elles soient affectées

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 419
    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 419
    Par défaut
    Ou sinon en propre dans ta fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    exec {var}>&1
    exec 1>fichier
     
    le corps de ta fonction
     
    exec 1>&$var
    exec {var}>&-
    Ici, le but de passer par une variable (var) , c'est le système qui gérera le descripteur de fichier et non toi. L'avantage, c'est que par exemple si le fd 3 est déjà utilisé, il en utilisera un autre.

  12. #12
    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
    Intéressant mais je trouvais que fondamentalement ça ne change pas le problème, que je le nomme (ou que je laisse le système gérer,sauf si tu sous-entends que le &3 va paraître occupé dans une fonction appelée depuis ma fonction, mais j'aurais eu un message d'erreur bad descriptor un truc du genre...). Toutefois je teste ça dès demain en simplifiant, en repartant de la base, En repartant de ce qui marche et bien voir là où je perds le fil, merci. La suite bientôt

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 419
    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 419
    Par défaut
    pour l'instant, on ne sait rien de ton fichier de départ et de ton fichier d'arrivée (en supposant que ton fichier de départ, c'est tous les echo de ta fonction)

    En général, pour que l'on puisse aider, faut mettre le code qui pose problème, ce que l'on a au départ et ce que l'on veut au final histoire que l'on puisse reproduire.

  14. #14
    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
    Bonjour,
    j'entends bien, je prépare une version typique pour dans la matinée, pas tout de suite, (je pensais que décrire suffirait).

  15. #15
    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
    Voilà ce que j'ai à la base :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    #!/bin/bash
     
    function config_tmpfs {
     
    	if [ "$(ls -al $MYTMPFS | awk '{ print $1}')" != "drwxrwxrwt" ]; then
    		echo "NO"
    		echo -n "Correction des permissions ... "
    		{ sudo chmod 1777 "$MYTMPFS" && echo "OK" ;} || {
    			echo "Echec" ; echo "1/ Abandon: voir logs !"  && return 1
    		}
    	else
    		echo "OK"
    	fi
    	echo -n "Montage du répertoire en RAM ... "
    	if sudo mount -t tmpfs -o size=512M tmpfs "$MYTMPFS"; then
    		echo "OK"
    		echo -n "Config XTRACE ... "
    		F_XTRACE_LOGS="$MYTMPFS/f_xtrace.logs"
    		touch "$F_XTRACE_LOGS"
    		exec {BASH_XTRACEFD}>>"$F_XTRACE_LOGS" # redirige xtrace vers un fichier de logs temporaire !
    		set -x
    		echo "OK"
    		echo -n "Création arborescence dans $MYTMPFS ... "
    		if ! rsync -avR "sql_rep" "$MYTMPFS/"; then
    			echo "Echec"
    			echo "2/ Abandon: voir logs !" && return 1	
    		else
    			echo "OK"
    		fi
    	else
    		echo "Echec"
    		echo "3/ Abandon: voir logs !" && return 1
    	fi
    	return 0
    }
     
    function init_stuff {
    	if [ -z "$1" ]; then
    		echo "argument bof" # voire perrave
    		return 1
    	else
    		# source variables et fonctions
    		source ./des_fonctions.sh
    		source ./des_variables.sh
    		echo "MYTMPFS: $MYTMPFS"
    		echo -n "Check: existence $MYTMPFS ... "
    		if [ ! -d "$MYTMPFS" ]; then
    			echo "NO"
    			echo -n "Création du répertoire $MYTMPFS ... "
    			if ! sudo mkdir "$MYTMPFS"; then
    				echo "Echec"
    				echo "0/ Abandon: voir logs !" && exit 1
    			else
    				echo "OK"
    				echo -n "Check droits sur répertoire $MYTMPFS ... "
    				config_tmpfs || exit 1
    			fi
    		else
    			echo "OK"
    			echo -n "Check droits sur répertoire $MYTMPFS ... "
    			config_tmpfs || exit 1	
    		fi
    	fi
     
    }
     
     
    init_stuff test
    exit 0
    1/ mon premier souci qui m'a mené à explorer les redirections, c'était de contrôler l'affichage sur stdout :
    - j'ai mis du temps à trouver la variable BASH_XTRACEFD pour que les traces aillent dans un fichier à part, ça c'est fait
    - de là j'ai voulu mettre en forme la sortie standard, en alignant les lignes "label" + "resultat" sur 2 colonnes, basique. Plutôt que de faire une fonction bourrine qui me remplit "label" d'espace jusqu'à length max, je souhaite utiliser column (mais column ne prend pas d'argument de taille, juste un séparateur de champs, ça c'est utile)
    - je peux me dire qu'au lieu d'appeler echo, j'appelle une fonction de des_fonctions.sh qui me revoie la string "label" en concaténant un '|' comme séparateur (ici je l'ai pas inscrit mais en gros c'est l'idée)

    2/ Maintenant s'il y a une solution beaucoup plus simple que ce que je décris, pour contrôler la sortie et la formater à mon goût, je suis clairement preneur.

    3/ Donc je vais un peu regarder dans la matinée, comment en redirigeant les echo dans un fichier, je peux mettre les chaînes au format voulu. Évidemment je ne m'intéresse là aux redirections que parce que ça me parait propre (je me vois pas rajouter en fin de chaque "echo bidule" un >fic_bidule. Mieux vaut faire un exec une bonne fois et être tranquille jusqu'à ce que j'ai besoin de rétablir les directions.
    Ici dans l'exemple je ne gère pas stderr mais c'est prévu que &2 aille dans un autre fichier de logs.

    NB: peu important pour l'exemple, mais les fichiers sourcés sont du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #!/bin/bash
    #des_fonctions.sh:
    function renvoie_string { echo "$*" ;}
    function special_renvoi_string { echo "$*|" ;}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #!/bin/bash
    # des_variables.sh
    export THE_FIC=./the_fic
    export OTHER_FIC=./other_fic
    export MYTMPFS=./MYTMPFS

  16. #16
    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
    Imaginons que le script soit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [ ! -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}>&-
    Ceci ne marche pas, il lit le pipe sans même que je le demande (comme si stdout était normal, et là je comprends pas pourquoi. Dans mon esprit, il fallait que je fasse un `cat fipe` pour lire tout en vidant ce satané tampon. D'AILLEURS JE NE SUIS MÊME PAS SÛR QU'IL LE LISE, JE CROIS QUE RIEN NE S'ÉCRIT DEDANS EN FAIT

    NB: si je redirige dans un fichier normal, ça marche impecc, je capture mon texte et je peux le traiter tranquille en suite. C'est déjà une bonne chose, je peux m'en contenter

    C'est donc le fonctionnement de fifo que je comprends le moins là...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    <hs>
    ls -al $MYTMPFS | awk '{ print $1}' non.parce qu'il est piégeux de parser ls, et parce que les noms de variables tout en majuscules sont réservés, par convention, aux variables d'environnement (HOME, PATH, ...).
    </hs>

  18. #18
    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
    <hs>
    ls -al $MYTMPFS | awk '{ print $1}' non.parce qu'il est piégeux de parser ls,[/B]
    Ah oui merci j'attendais de tomber sur une autre solution, effectivement ls m'a réservé quelques surprises lol qui auraient pu s'avérer sytèmement cataclysmiques

    Citation Envoyé par N_BaH Voir le message
    [B]
    et parce que les noms de variables tout en majuscules sont réservés, par convention, aux variables d'environnement (HOME, PATH, ...).
    </hs>
    Ça par contre ça se discute , les points de vue diverge selon les sources. Je prends peu de risque si je personnalise le nom de la variable et moi j'y vois plus clair, ( no way ? )

    NB: cela dit, "$myTmpFS" c'est joli à l'oeil, le seul inconvénient c'est que ça m'oblige à toucher deux fois la touche maj hihi

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 730
    Par défaut
    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.

    le "panachage" permet, àmha, une meilleure lisibilité et compréhension de ce que contient l'élément (variable, fonction, alias,..) (puisque le nom doit être évocateur de ce que c'est).

  20. #20
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 419
    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 419
    Par défaut
    Citation Envoyé par Dens1 Voir le message
    Imaginons que le script soit ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    [ ! -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}>&-
    Ceci ne marche pas, il lit le pipe sans même que je le demande (comme si stdout était normal, et là je comprends pas pourquoi. Dans mon esprit, il fallait que je fasse un `cat fipe` pour lire tout en vidant ce satané tampon. D'AILLEURS JE NE SUIS MÊME PAS SÛR QU'IL LE LISE, JE CROIS QUE RIEN NE S'ÉCRIT DEDANS EN FAIT

    NB: si je redirige dans un fichier normal, ça marche impecc, je capture mon texte et je peux le traiter tranquille en suite. C'est déjà une bonne chose, je peux m'en contenter

    C'est donc le fonctionnement de fifo que je comprends le moins là...
    Ok, la fifo, c'est plus vicieux, pour l'utiliser c'est plus du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ mkfifo fic
    $ exec {var}>&1
    $ exec 1<>fic
    $ echo foobar
    $ exec 1>&$var
    $ read xx <fic 
    $ echo $xx
    foobar
    Comme tu peux le voir, la fifo est à la fois une entrée et une sortie, d'où le exec 1<>fic pour que cela ne soit pas bloquant, ensuite pour l'écriture, pas de soucis, par contre la lecture de la fifo est plus compliqué, car les commande tel que cat reste bloqué à la fin.
    C'est la raison pour laquelle, dans l'exemple, j'utilise la commande read qui ici ne bloque pas car il y a bien une ligne à récupérer, mais si la fifo est vide, alors le read restera bloquant aussi.
    Par chance, au moins sous bash, le read possède une option de timeout qui renvoie un code erreur.
    Donc, pour vider la fifo, un simple code du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read -t 3 xx ; do echo $xx ; done <fic
    devrait fonctionner ( sauf s'il lui faut plus de 3 secondes pour lire une ligne)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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, 19h37
  2. Réponses: 2
    Dernier message: 28/04/2004, 12h25
  3. problème d'acces concurentiel à un fichier
    Par Theoden dans le forum MFC
    Réponses: 2
    Dernier message: 04/03/2004, 10h49
  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, 20h42
  5. Descripteur de fichier
    Par Zazeglu dans le forum C
    Réponses: 22
    Dernier message: 15/09/2003, 20h45

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