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 d'affichage commande echo en temps réel {perl/csh}


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
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut Problème d'affichage commande echo en temps réel {perl/csh}
    Bonjour,

    je suis face a une problématique dont je n'ai pour l'instant pas la solution.

    J'utilise un script en perl (que je n'ai pas écris, je suis débutant en perl et pour le moment j'essaye juste de faire des modifs sur les scripts existants), donc ce script sert a mettre des fichiers ds un BDD (avec un pseudo versionning).

    Dans une partie du script je fais appel a un script cshell qui a pour objectif de faire un .tar sur l'ensemble des fichiers que je souhaites archiver. La seconde action sert a contrôler des coordonnées sur un des fichiers.

    Vous allez me dire mais pourquoi ne pas tout avoir écrit en perl, n'ayant pas de base en perl et personne pour réellement me supporter j'ai écris ce script en cshell ( mm pas en bash ).

    J'ai choisi cette option car dans le script perl en question il y a déjà d'autres scripts cshell qui sont appelés et cela fonctionne correctement... difficile de partir sur tous les front cshell bash perl awk etc... je pioche un peu partout sans vraiment rien maîtriser lol!

    Ci-dessous un extrait du script perl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    print $Tee "==================================================\n";	
    			print $Tee "Creation of archive file \n";
    			#print $Tee "Add here the xor.gds that you want to save \n";
    			my $Archive_File = `Ewip_files -tegname ${TegName} -tegroot ${Dir}`;
    			print $Tee "$Archive_File";
    			my $My_Local = "gds is missing";
    			my $Return = "$Archive_File" cmp "$My_Local";
    			if ($Return == 1){
    			print $Tee "Exit of Config_generator_file \n";
    			exit;
    			}
    			print $Tee "==================================================\n";
    A la 3 eme lignes je fais appel au script Ewip_files (Ewip_files.csh) et la problématique que je rencontre c'est que dans ce script a moment donnée j'affiche des coordonnées et je demande a l'utilisateur de contrôler visuellement les coordonnées que j'affiche et je lui pose la question "Voulez-vous continuer? Tapez oui ou non"

    Partie du script cshell Ewip_files:

    Code CSH : 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
    awk '{\
    			{xp1= $1; yp1= $2; xp2= $3; yp2= $4;} {largeur = xp2 - xp1; hauteur = yp2 - yp1; surface = largeur * hauteur;} {delta1 = yp2 - int(yp2); delta2 = yp1 - int(yp1); delta3 = xp1 - int(xp1); delta4 = xp2 - int(xp2);}\
    			printf("\nTEG dimensions (in um):\n");\
    			printf("	Width     : %10.6f\n",largeur);\
    			printf("	Length    : %10.6f\n",hauteur);\
    			printf("	Area      : %10.6f\n\n",surface);\
    			#printf("\ndelta1 = %10.6f \n",delta1);\
    			#printf("delta2 = %10.6f \n",delta2);\
    			#printf("delta3 = %10.6f \n",delta3);\
    			#printf("delta4 = %10.6f \n",delta4);\
    			if (!( delta1 == 0 ) || !( delta2 == 0 ) || !( delta3 == 0 ) || !( delta4 == 0 )){\
    			printf("ERROR:  Layout BBOX must be coincident with micrometer scale\n");\
    			printf("	Top left BBOX coordinates: (%10.3f;%10.3f) \n",xp1,yp1);\
    			printf("	Bottom right BBOX coordinates: (%10.3f;%10.3f) \n",xp2,yp2);\
    			printf("RELEASE STOPPED: Ensure layout BBOX is coincident with micrometer scale \n");\
    			exit }\
    			else {\
    			printf("TEG aligned with micrometer scale :-) \n");\
    			}\
    		}' points.txt
    	echo ""
    	echo "******************************************************"
    	echo "* Please take a moment to check the size of your teg *"
    	echo "******************************************************"
    	echo ""
    	echo "Would you like to continue? type only yes or no"
    	set sizeanswer=$<
     
    	if ( $sizeanswer == "no" ) then
    	exit
    	endif

    La problématique est que sur mon terminal après avoir afficher "Creation of archive file" il attend une réponse et je ne comprends pas pourquoi tous les echo ne s'affiche pas ? il s'affiche une fois que j'ai répondu yes or no mais pour répondre yes or no il me faut connaitre les coordonnées fournit par la commande awk ci-dessus.

    Pour info j'ai posté le mm message dans le forum perl.

    N'hesitez pas a me demander des infos supplémentaires merci pour votre aide.

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

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

    selon moi, c'est un problème perl.
    il y a des substitutions de commandes (`commande`) en perl ?

    et, pourquoi csh ?
    ce shell est tellement peu pratique/ergonomique. :/
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    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 354
    Par défaut
    Bonjour,
    Oui, il y a des substitutions de commandes qui ressemblent à celles du shell en perl...

    Pour ma part, je pense aussi que le problème vient de la bufferisation du perl...
    Essaye en rajoutant dans ton script perl, la ligne suivante (au début) :
    Ceci dit, en gros, à perl de ne pas bufferiser, donc en principe, cela devrait t'afficher les messages.

  4. #4
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Merci pour le retour, j'essaye ca demain matin et vous tiens au courant. Donc il n' y a rien a voir du coté de std out, forcer la redirection?

    Clairement je me suis mis au bash si je dois faire un nouveau script.

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Mai 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 12
    Par défaut
    Bonsoir,
    je ne comprends pas pourquoi tous les echo ne s'affiche pas ? il s'affiche une fois que j'ai répondu yes or no mais pour répondre yes or no il me faut connaitre les coordonnées fournit par la commande awk ci-dessus.
    Je ne connais pas du tout le cshell, mais un moyen de contourner le problème serait de poser 2 fois la question, en ignorant la 1ère réponse, qui servirait seulement à afficher les "echo" avant la 2ème...
    C'est pas bien joli, naturellement, mais cela éviterait d'avoir à piocher le manuel csh pendant des heures!

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    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 354
    Par défaut
    Bon, en fait, j'ai un peu dit n'importe quoi (pas mal fatigué, le gars, en ce moment )...
    Ce n'est pas une histoire de bufferisation, c'est une histoire de redirection:
    en perl, quand tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $Archive_File = `Ewip_files -tegname ${TegName} -tegroot ${Dir}`;
    tu rediriges toute la sortie standard dans la variable $Archive_File, c'est pour cette raison que tu vois tout s'afficher une fois que la commande est finie, car c'est la ligne juste après qui t'affiche le tout.
    Et là, je ne vois pas trop de solutions (propres), car à priori, tu veux à la fois afficher des trucs sur l'écran et récupérer une valeur à la fin pour la suite de ton script perl.
    Mais voici un début d'idée:
    j'utilise la sortie d'erreur (2) car comme elle n'est pas redirigée, elle pointe sur mon terminal.
    je crée un fd supplémentaire (3) qui pointera sur la même chose que 2
    ensuite, je switch (1) avec (3), pour que le (1) qui est la sortie standard pointe sur le terminal et le (3) pointe sur la sortie pipé par le perl.
    Et donc, tout echo non redirigé sortira sur le terminal et tout echo redirigé vers (3) sera capturé par le perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ perl -e '$BOB=`exec 3>&2 ;bash -c "echo attend la touche entree;read;echo -n toto >&3" 6>&1 1>&3 3>&6 6>&-`;print "XX${BOB}XX\n"'
    attend la touche entree
     
    XXtotoXX
    Donc, ce qu'il te reste a faire, c'est de modifier ton script csh pour qu'il écrit juste ce que tu veux que le perl capture sur la sortie 3 et modifier ta ligne perl comme quelque chose qui ressemble à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $Archive_File = `exec 3>&2 ; Ewip_files -tegname ${TegName} -tegroot ${Dir} 6>&1 1>&3 3>&6 6>&-`;

  7. #7
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Merci pour votre aide, pour être honnête je suis un peu perdu...

    avec cette histoire de redirection.

    Si je comprends bien:

    j'utilise la sortie d'erreur (2) car comme elle n'est pas redirigée, elle pointe sur mon terminal. ==> Je dois rediriger tout les echo vers 2> ?

    je crée un fd supplémentaire (3) qui pointera sur la même chose que 2 ==> `exec 3>&2 ?

    ensuite, je switch (1) avec (3), pour que le (1) qui est la sortie standard pointe sur le terminal et le (3) pointe sur la sortie pipé par le perl. ==> 6>&1 1>&3 3>&6 6>&-` ? La je ne comprends pas...

    Même méthode pour les printf de la commande awk?

    Merci pour le coup de main.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par julien terrier Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    print $Tee "==================================================\n";	
    			print $Tee "Creation of archive file \n";
    			#print $Tee "Add here the xor.gds that you want to save \n";
    			my $Archive_File = `Ewip_files -tegname ${TegName} -tegroot ${Dir}`;
    			print $Tee "$Archive_File";
    			my $My_Local = "gds is missing";
    			my $Return = "$Archive_File" cmp "$My_Local";
    			if ($Return == 1){
    			print $Tee "Exit of Config_generator_file \n";
    			exit;
    			}
    			print $Tee "==================================================\n";
    Je ne maîtrise pas bien le perl et le csh, mais je crois comprendre qu'à la ligne 7 tu compares le "résultat" de l'exécution du script "Ewip_files" avec la chaine "gds is missing".

    Or je ne vois pas apparaître cette chaîne dans le script.

    L'explication qui me vient à l'esprit serait que ce script a été adapté et que son sens a changé. Peux-tu confirmer/infirmer/expliquer?

    Anyway, il me paraitrait plus judicieux/standard d'utiliser le code de retour du script de la manière suivante:
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    my $Tee = *STDOUT;
    my $TegName = "TegName";
    my $Dir = "Dir";
    my $Archive_File = "Archive_File";
     
    print $Tee "==================================================\n";
    print $Tee "Creation of archive file \n";
     
    #print $Tee "Add here the xor.gds that you want to save \n";
    system("./Ewip_files -tegname ${TegName} -tegroot ${Dir}");
    my $Return = $?; # CHILD_ERROR;   # ou bien $?
    print $Tee "$Archive_File";
    #my $My_Local = "gds is missing";
    #my $Return = "$Archive_File" cmp "$My_Local";
    if ($Return != 0) {
      print $Tee "Exit of Config_generator_file \n";
      exit;
    }
    print $Tee "==================================================\n";
    Avec, pour le script:
    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
    #!/bin/csh
     
    awk '{\
    	{xp1= $1; yp1= $2; xp2= $3; yp2= $4;} {largeur = xp2 - xp1; hauteur = yp2 - yp1; surface = largeur * hauteur;} {delta1 = yp2 - int(yp2); delta2 = yp1 - int(yp1); delta3 = xp1 - int(xp1); delta4 = xp2 - int(xp2);}\
    	printf("\nTEG dimensions (in um):\n");\
    	printf("	Width     : %10.6f\n",largeur);\
    	printf("	Length    : %10.6f\n",hauteur);\
    	printf("	Area      : %10.6f\n\n",surface);\
    	#printf("\ndelta1 = %10.6f \n",delta1);\
    	#printf("delta2 = %10.6f \n",delta2);\
    	#printf("delta3 = %10.6f \n",delta3);\
    	#printf("delta4 = %10.6f \n",delta4);\
    	if (!( delta1 == 0 ) || !( delta2 == 0 ) || !( delta3 == 0 ) || !( delta4 == 0 )){\
    		printf("ERROR:  Layout BBOX must be coincident with micrometer scale\n");\
    		printf("	Top left BBOX coordinates: (%10.3f;%10.3f) \n",xp1,yp1);\
    		printf("	Bottom right BBOX coordinates: (%10.3f;%10.3f) \n",xp2,yp2);\
    		printf("RELEASE STOPPED: Ensure layout BBOX is coincident with micrometer scale \n");\
    		exit }\
    	else {\
    		printf("TEG aligned with micrometer scale :-) \n");\
    	}\
    }' points.txt
    echo ""
    echo "******************************************************"
    echo "* Please take a moment to check the size of your teg *"
    echo "******************************************************"
    echo ""
    echo "Would you like to continue? type only yes or no"
    set sizeanswer=$<
    #set sizeanswer="no"
     
    if ( $sizeanswer == "no" ) then
        echo "You said no"
        exit 1
    endif
     
    echo "You said yes"
     
    exit 0
    La question importante est: as-tu besoin de traiter la sortie du script csh?

    Si oui, peut-être faut-il faire 2 scripts, le 1er comme celui que je propose pour afficher les données et poser la question à l'utilisateur et un 2ème pour faire le traitement.

    Ou bien, faire un 1er script (csh/awk) juste pour afficher les données, puis, depuis perl, poser la question et éventuellement lancer un autre script avec la suite du traitement.

    EDIT (addendum)
    En mettant "3 4 5 6" dans mon "points.txt", j'obtiens la sortie suivante:
    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
    $ ./test.pl 
    ==================================================
    Creation of archive file 
     
    TEG dimensions (in um):
    	Width     :   2,000000
    	Length    :   2,000000
    	Area      :   4,000000
     
    TEG aligned with micrometer scale :-) 
     
    ******************************************************
    * Please take a moment to check the size of your teg *
    ******************************************************
     
    Would you like to continue? type only yes or no
    yes
    Archive_File==================================================
    ou bien:
    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
    $ ./test.pl 
    ==================================================
    Creation of archive file 
     
    TEG dimensions (in um):
    	Width     :   2,000000
    	Length    :   2,000000
    	Area      :   4,000000
     
    TEG aligned with micrometer scale :-) 
     
    ******************************************************
    * Please take a moment to check the size of your teg *
    ******************************************************
     
    Would you like to continue? type only yes or no
    no
    You said no
    Archive_FileExit of Config_generator_file

  9. #9
    Membre éclairé
    Homme Profil pro
    Technicien Layout
    Inscrit en
    Août 2015
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien Layout

    Informations forums :
    Inscription : Août 2015
    Messages : 275
    Par défaut
    Merci pour votre aide!

    @disedorgue ==> Très instructif il va me falloir un peu de temps pour digérer tes explications mais je prends note, et compte bien le restituer asap

    @hotcryx ==> je souhaites afficher sur sur la sortie standard tout les printf et echo de mon script csh cela ce fait mais en décaler pour le coup ca ne me convient pas...

    @jack-ft ==> ligne 7 tu compares le "résultat" de l'exécution du script "Ewip_files" avec la chaîne "gds is missing". Plus loin dans mon script csh ( la ce n'est qu'un bout du script) je viens contrôler si le fichier xxx.gds existe si ce n'est pas le cas je saute dans une condition avec echo "gds is missing" ou j'assigne une variable avec cette chaine de caractère, je ne sais plus (le script est au taf je ne l'ai pas sous les yeux)... Cela me permet d'aborter le script perl si le fichier xxx.gds n'y ait pas, je l'ai éprouvé ca fonctionne.

    Anyway, il me paraîtrait plus judicieux/standard d'utiliser le code de retour du script de la manière suivante: ==> Pareil je prends note et je vais essayer de cette manière merci.

    Comme tu le suggère je vais retirer la partie awk du script csh pour en faire en script a part entière le jouer, traitement et affichage, poser la question en perl, on m'a expliquer une façon de faire pour poser une question en perl avec my variable = <STDIN> et un chomp sur $variable pour le caractère de fin de ligne bref puis exécuter le script ewip_files comme auparavant...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/03/2013, 10h50
  2. MFC - affichage de données en temps réel
    Par limprid dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2012, 20h04
  3. Affichage signal audio en temps réel
    Par Uren dans le forum C#
    Réponses: 8
    Dernier message: 28/09/2011, 19h49
  4. Affichage d'un compteur temps réel
    Par Karcynotron dans le forum MFC
    Réponses: 1
    Dernier message: 27/05/2008, 21h47
  5. Affichage de traces en temps réel -- CEdit
    Par vonemya dans le forum MFC
    Réponses: 4
    Dernier message: 23/08/2007, 15h53

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