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 :

Stderr en couleur avec BASH


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut Stderr en couleur avec BASH
    Bonjour,

    J'écris un script et je voudrais que les sorties d'erreur soient imprimées en rouge. J'arrive bien à changer de couleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
    
    init="\E[0m"
    red="\E[31m"
    echo -e "$redtoto$init"
    toto
    Mais je ne sais pas comment indiquer que dans mon script, toute sortie sur stderr doit changer de couleur.

    Une idée?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Par défaut
    peut être de faire une fonction qui réaliserai ceci ....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    affichestderr 
    {
    black="\E[30m"
    red="\E[31m"
    echo -e "$red""$1""$black"
     
     
    }
    affichestderr "la chaine a afficher"

  3. #3
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Arrrggghhh... Je me suis mal exprimé, désolé.

    J'écris un script qui se connecte sur de nombreuses machines les unes après les autres et qui exécute les commandes que je lui passe (par ssh). Le retour m'apparait dans la console. C'est le retour de ssh. Le texte normal passe par stdout et les erreurs par stderr. Je voudrais que les erreurs soient plus visibles et donc apparaissent en rouge. Ce n'est pas moi qui écris les messages, je ne sais pas ce qui va sortir et sur quel canal.

    Donc ma question est : Comment, en début de script, dire que tout ce qui sort sur stderr doit être écrit en rouge (alors que le texte normal reste en noir)? Est-ce possible, au moins?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Arrrggghhh... Je me suis mal exprimé, désolé.

    J'écris un script qui se connecte sur de nombreuses machines les unes après les autres et qui exécute les commandes que je lui passe (par ssh). Le retour m'apparait dans la console. C'est le retour de ssh. Le texte normal passe par stdout et les erreurs par stderr. Je voudrais que les erreurs soient plus visibles et donc apparaissent en rouge. Ce n'est pas moi qui écris les messages, je ne sais pas ce qui va sortir et sur quel canal.

    Donc ma question est : Comment, en début de script, dire que tout ce qui sort sur stderr doit être écrit en rouge (alors que le texte normal reste en noir)? Est-ce possible, au moins?
    en vous inspirant de

    http://www.travishartwell.net/blog/2006/08/19_2220

    cela devrait aller…

    (remplacez les 2 lignes "echo" de l'exemple par votre "ssh commande")

  5. #5
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Perso j'aurai fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/bash
    # set stderr to red
    red="\E[31m"
    echo -e "$redtoto$init"  >&2 
     
    # code...
    Mais en testant (quand même), ça ne marche pas (c'est rouge même pour stdout).
    Du coup google-> http://linux.derkeiler.com/Newsgroup.../msg00754.html
    En re-formatant ça peut donner ça:

    "loco.pl" ,0.32 ,http://zjuul.net/~jules/loco/ ,$0 ,"filter to colorize file/stdin: implements Term::ANSIColor" ,<zuntum@xxxxxxxxxx>
    "dump_set.ksh" ,1.5 ,http://www.xs4all.nl/~gerardvw/HOME/...tions/dump_set ,$0 ,"show color combinations on ANSI terminal" ,GVW
    "colortable16.bash" ,,http://frexx.de/xterm-256-notes/ ttp://frexx.de/xterm-256-notes/data/colortable16.sh ,$0 ,"display color table" ,"Wolfgang Frisch" <xororand@xxxxxxxxx> ^ vim(1) colorschemes for xterm''s 256 extended color : http://www.vim.org/scripts/script.php?script_id=1143 http://frexx.de/xterm-256-notes/themes/desert256.vim
    "ScriptEchoColor.bash" ,1.14 ,http://sf.net/projects/scriptechocolor/ , $0 ,"text/script colorizing/formatting" ,"Henrique 'Teike' Abdalla" <teike@xxxxxxxxxxxx> ^ RM: Integrated with StructIntegrDB.String
    "regex-markup." ,0.9.0 ,http://www.gentooexperimental.org/~k...ex-markup.html ,$0 ,"color syslog files: NCA"
    "Cheap ANSI color!" ,,http://linuxgazette.net/issue01to08/articles.html#ansi ,$0 ,"webpage" ,"Jim Valentine" <simon@xxxxxxx>
    "dircolors." ,,http://linuxgazette.net/issue01to08/misc/ ,$0 ,"" ,"H. Peter Anvin" <Peter.Anvin@xxxxxxxxx> ^ http://linuxgazette.net/issue01to08/misc/DIR_COLORS
    "(Not So) Stupid Shell Tricks" ,2003-09-15 ,http://www.linux-mag.com/id/1456 ,$0 ,"webpage" ,JP
    "cecho.sh" ,,http://www.zazzybob.com/bin/cecho.html ,$0 ,""
    "Linux Colors in Aterm/rxvt" ,,http://gentoo-wiki.com/TIP_Linux_Colors_in_Aterm/rxvt ,$0 ,"webpage"
    "dircolors." ,,XXX,http://homepages.cwi.nl/~aeb/linux/m...rcolors.1.html ,$0 ,"" ,<aeb@xxxxxx>
    "libcolor.bash" ,,http://vaab.free.fr/utilities/vlfs-shlib/index.en.html ,$0 ,": contained-in vlfs-shlib" ,"Valentin Lab" <vaab@xxxxxxx>
    "zen.bash" ,0.1b ,http://www.ibiblio.org/pub/linux/sys...en-0.1b.tar.gz ,$0 ,"color schemes , prompt schemes , and a formatted vhost table , bashrc and global bash profiles" ,"Tim Perkins" <tperkins@xxxxxxxxxxxx>
    "setcolours.{bash3 ,ksh93}" ,*1.16 ,ftp://ftp.sysdev.org/pub/lintools/LTT/ ftp://ftp.sysdev.org/pub/lintools/LTT/readme.txt ,$0 ,"console environment colour posting utility: component-of LTT" ,"Tony Borras" <tonyb@xxxxxxxxxx ,tools- request@xxxxxxxxxx?subject=subscribe> ^ QT: Used in conjuction with emit.sh console colour manager
    "colorifer.c" ,1.0.1rc6 ,http://colorifer.sf.net/ ,$0 ,"set of utilities to color output of other processes" ,"Stanislav Ievlev" <inger@xxxxxxxxxxx ,inger@xxxxxxxxxxxx>
    "Alexey Voinov" ^
    "CSed." ,,,$0 ,"color stream editor" ^
    "Colorifer.sh" ,,,$0 ,"wrapper to run program and colorize it's output" ^
    "Pcolorize.sh" ,,,,"setup colorifer"
    "Daniels Colorize.pl" ,,http://freshmeat.net/projects/colorize_perl/ , $0 ,"colorizer" ,"Daniel Flinkmann" <dflinkmann@xxxxxx>
    "cw.c" ,,http://sf.net/projects/cwrapper/ http://directory.fsf.org/cw.html http://freshmeat.net/projects/cw/ ,$0 ,"Color Wrapper -- ANSI color wrapper" ,<v9@xxxxxxxxxxxxxxxxxxxx> ^ RM: designed to simulate the environment of the commands being executed
    "ColorDiff." ,,http://freshmeat.net/projects/colordiff/
    "cse." ,,http://freshmeat.net/projects/csed/
    "colormake.pl" ,0.2-3.2 ,http://bre.klaki.net/programs/colormake/ , $0 ,"simple wrapper around make(1) to colorize output" ,"Bjarni R. Einarsson"
    "colors.sh" ,,http://www.intuitive.com/wicked/show...?011-colors.sh ,$0 ,"" ,
    "colourshell.bash" ,,http://freshmeat.net/projects/colourshell/ http://chezphil.org/colourshell/ ,$0 ,"colourise interactive bash(1) session" ,"Phil Endecott" <http://chezphil.org/feedback/index.html>
    "color" ,1.1 ,http://www.runslinux.net/projects/color http://www.runslinux.net/projects.html#Color ,$0 ,"" ,"Moshe Jacobson" <http://www.runslinux.net/contact.html>

    et surtout:

    "hilite.",1.5,http://sf.net/projects/hilite ,$0,"highlights stderr text in red"

    Enfin en zsh, il y a aussi ça: http://fr.gentoo-wiki.com/wiki/Zsh

  6. #6
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour et merci pour les réponses.

    De mon côté, j'ai essayé différentes solution impliquant les redirections des entrées - sorties, mais j'arrive au même résultat que D[r]eadLock:
    Soit la couleur de stderr est bien rouge, mais stdout l'est également:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo -e "\E[31m" >&2; ssh root@ordi "ls toto"
    ls: toto: No such file or directory #yessss!!!
    echo -e "\E[31m" >&2; ssh root@ordi "ls"
    fichier_1
    fichier_2 # Et m...
    Soit tout reste noir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    echo -e "\E[31m" 2> /dev/null >&2; ssh root@ordi "ls toto"
    ls: toto: No such file or directory # et re-m...
    echo -e "\E[31m" 2> /dev/null >&2; ssh root@ordi "ls"
    fichier_1
    fichier_2 # au moins, ici ça marche...
    J'ai bien étudié les liens proposés, mais je ne suis pas encore à l'aise avec les redirections, genre exec 1>&3 3>&- 2>&4 4>&- ou plutôt je n'en comprends pas l'intérêt. Mais j'étudie...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bah !?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ssh root@ordi 'echo -e "\E[31m" >&2; ls'
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Malheureusement, N_BaH, j'obtiens la même chose: tout la sortie de la commande ls est rouge, même lorsque tout va bien.

    J'ai finalement réussi, mais pas par le chemin des redirections: j'utilise le retour de ssh qui est très varié lors d'une commande passée en paramètre:

    • ssh retourne une valeur entre 0 et 127: c'est le retour de la (dernière) commande ou du script.
    • ssh retourne 255: problème ssh (comme une clé pas à jour, une machine inexistante, une machine arrêtée).

    Attention, si certaines machines sont arrêtées, il est nécessaire de réduire le timeout du client ssh pour éviter les 90 secondes pour rien (ConnectTimeout 10). Donc j'utilise le code de retour de ssh pour passer toute la sortie de la commande en couleur. Ce n'est pas aussi fin que ce que je voulais faire, mais c'est déjà pas mal. Je vous donne le source, toute remarque étant appréciée.
    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
    #!/bin/bash
    
     # display usage function, no arg
    function displayUsage
    {
      echo -e "Usage: $(basename $0) {\E[1m-h\E[0m <host1[,host2[,...]]>|\E[1m-H\E[0m <host_file>} \
    {\E[1m-c\E[0m \"command list\"|\E[1m-C\E[0m <command_file>}\n\t\
    host_file and command_file must be visible from host that run $(basename $0)."
    }
    
     # get script options
    unset hstList
    unset cmdList
    while getopts ":h:H:c:C:" option
    do
      case $option in
      h )
        hstList=$(echo $OPTARG | tr ',' ' ')
      ;;
      H )
        hstList=$(cat $OPTARG | tr ',' ' ')
      ;;
      c )
        cmdList=$OPTARG
      ;;
      C )
        cmdList=$(cat $OPTARG)
      ;;
      \? )
        displayUsage
        exit 1
      ;;
      esac
    done
    if [[ -z $hstList ]] || [[ -z $cmdList ]]
    then
      displayUsage
      exit 1
    fi
    
     # init color codes
    initColor='\E[0;0;0m'
    boldColor='\E[1m'
    revColor='\E[1;37;40m'
    redColor='\E[0;31;0m'
    revRedColor='\E[1;31;40m'
    
     # run command list on host list
    for hst in $hstList
    do
      echo -e "$revColor# $hst$initColor"
      output=$(ssh root@$hst $cmdList 2>&1)
      retCode=$?
      if [[ $retCode == 0 ]]
      then
        echo "$output"
      elif [[ $retCode == 255 ]]
      then
        echo -e "$revRedColor### ssh error: $output$initColor"
      else
        echo -e "$boldColor$output$initColor"
      fi
    done
    C'est très sympa comme commande lorsqu'il y a des centaines d'ordinateurs sur lesquels il faut lancer la même commande et récupérer le résultat. Bien sûr, il faut que la clé ssh de l'admin soit bien propagée sur l'utilisateur root de toutes les machines.

    Edit: petite modif du code pour l'utilisation du code de retour.

Discussions similaires

  1. Couleur dans la console avec Bash
    Par damien77 dans le forum Debian
    Réponses: 5
    Dernier message: 18/03/2007, 18h02
  2. Réponses: 2
    Dernier message: 26/04/2006, 21h34
  3. comment mettre de la couleur avec format/write ?
    Par gedeon555 dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2006, 09h12
  4. Comptage avec bash
    Par ALT dans le forum Linux
    Réponses: 8
    Dernier message: 20/10/2004, 11h02
  5. pb couleur avec Scanline
    Par bobymaw dans le forum C++Builder
    Réponses: 6
    Dernier message: 10/05/2004, 22h25

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