OVH Cloud OVH Cloud

stderr en rouge dans un terminal

5 réponses
Avatar
Baptiste MATHUS
Bonjour à tous,

Bon, le dernier message est passé inaperçu, pourtant je suis sûr que
plusieurs personnes connaissent sûrement la solution à ce problème :).

J'aimerais que par exemple, avec le programme C suivant :

int main(void)
{
fprintf(stdout,"bonjour");
fprintf(stderr,"au revoir");
return 0;
}

Là, je voudrais que gnome-terminal affiche "bonjour" normalement, et "au
revoir" en rouge par exemple.

Quelqu'un aurait des infos sur le sujet ou une idée du comment faire ?

Merki beaucoup.
@++
--
Baptiste <Batmat> Mathus
BMathus at Free point fr - http://batmat.net
---------
Si chacun de nous a une idée et que nous les partageons, nous
repartirons tous les deux avec deux idées... C'est ça le Libre.


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

5 réponses

Avatar
ismael
> int main(void)
{
fprintf(stdout,"bonjour");
fprintf(stderr,"au revoir");
return 0;
}

Là, je voudrais que gnome-terminal affiche "bonjour" normalement, et "au
revoir" en rouge par exemple.



réponse en une ligne :
fprintf (stderr, "33[31mau revoir");

Pour être plus clair, les terminaux, au moins sous GNU/Linux, sont
compatibles VT100 (ou postérieur). Du coup, on peut utiliser les codes
d'échappement qui permettent, entre autres, de spécifier des couleurs, de
positionner le curseur sur l'écran, ...

Sinon, je n'ai jamais essayé, mais il doit bien y avoir des bibliothèques
qui fassent ça, non ? ncurses ?

--
Jonathan ILIAS


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Jean-Michel OLTRA
bonjour,


Le mardi 27 septembre 2005, a écrit...


Pour être plus clair, les terminaux, au moins sous GNU/Linux, sont
compatibles VT100 (ou postérieur). Du coup, on peut utiliser les codes
d'échappement qui permettent, entre autres, de spécifier des couleurs, de
positionner le curseur sur l'écran, ...



voir :
http://gershwin.ens.fr/vdaniel/Doc-Locale/Outils-Gnu-Linux/Eterm-0.9/

Sinon, je n'ai jamais essayé, mais il doit bien y avoir des bibliothèques
qui fassent ça, non ? ncurses ?



Oui, il y a un bon ncurses programming howto, quelque part dans le vaste
monde.

--
jm



--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Baptiste Mathus
Selon :

> int main(void)
> {
> fprintf(stdout,"bonjour");
> fprintf(stderr,"au revoir");
> return 0;
> }
>
> Là, je voudrais que gnome-terminal affiche "bonjour" normalement, et "au
> revoir" en rouge par exemple.

réponse en une ligne :
fprintf (stderr, "33[31mau revoir");

Pour être plus clair, les terminaux, au moins sous GNU/Linux, sont
compatibles VT100 (ou postérieur). Du coup, on peut utiliser les codes
d'échappement qui permettent, entre autres, de spécifier des couleurs, de
positionner le curseur sur l'écran, ...


Bon, alors je me suis mal exprimé... Dans le premier message, je ne parlais pas
de programmation et là, ça a eu l'effet inverse.

Je sais afficher en couleur, je connais les codes ANSI et Ncurses :). Mais on
objectif n'est pas de savoir afficher une couleur dans un terminal à partir
d'un de mes programmes, ça ok.

Mon but est de faire que le terminal affiche tout ce qui est envoyé dans stderr
(que ce soit pas un script ou un programme système ou n'importe quoi d'autre,
c-a-d pas forcément du code à moi) s'affiche dans une couleur différente de
stdout. Des idées ?

(Pour les connaisseurs, la console d'eclipse le fait par défaut par exemple).

Ça me donne une idée tiens puisque vous parlez de codes ANSI, je regarderais ce
soir s'il n'existe pas un système de callback pour bash : peut-être qu'il est
possible d'automatiser le traitement de stdout et stderr par un programme
personnalisé. Auquel cas, il serait alors très simple d'écrire un petit prog
qui passe stderr en rouge avec une séquence ANSI...

Merci.
--
Baptiste <Batmat> Mathus
Baptiste at Mathus point org
http://batmat.net
---------
You want to use GNU/Linux or Windows ?
You want to spend time or money ?


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
ismael
> Mon but est de faire que le terminal affiche tout ce qui est envoyé dans
stderr
(que ce soit pas un script ou un programme système ou n'importe quoi
d'autre,
c-a-d pas forcément du code à moi) s'affiche dans une couleur différente
de
stdout. Des idées ?


Je pige mieux :)

Je ne connais rien qui fasse précisément cela. Par contre, il existe des
wrapper pour GCC et make. J'ai regardé colorgcc, ça ne devrait pas être
trop compliqué à adapter pour faire un wrapper pour bash. Mais bon, comme
je ne connais pas perl et que je ne suis pas dans le besoin, je m'épargne
le travail ;-)

C'est une piste en tout cas.

Sinon, je me suis posé la question de savoir s'il était possible de
rediriger les descripteurs de fichiers actuellement ouverts... Je serai
surpris que ce soit possible, mais on ne sait jamais :
ls -l /proc/self/fd/

Bon courage ;)
--
Jonathan ILIAS


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Vincent Lefevre
--YZ5djTAD1cGYuMQK
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: 8bit

On 2005-09-27 09:50:58 +0200, Baptiste Mathus wrote:
Mon but est de faire que le terminal affiche tout ce qui est envoyé
dans stderr (que ce soit pas un script ou un programme système ou
n'importe quoi d'autre, c-a-d pas forcément du code à moi) s'affiche
dans une couleur différente de stdout. Des idées ?



Il me semble que du point de vue du terminal, c'est impossible:
tout finit dans /dev/tty et le terminal ne sait pas d'où les
données proviennent. Donc la seule solution serait que ce soit
fait en amont, en particulier au niveau du shell, ou alors au
niveau du noyau.

(Pour les connaisseurs, la console d'eclipse le fait par défaut par
exemple).



Je ne connais pas la console d'eclipse, mais elle fonctionne peut-être
différemment d'un terminal texte conventionnel.

Ça me donne une idée tiens puisque vous parlez de codes ANSI, je
regarderais ce soir s'il n'existe pas un système de callback pour
bash : peut-être qu'il est possible d'automatiser le traitement de
stdout et stderr par un programme personnalisé. Auquel cas, il
serait alors très simple d'écrire un petit prog qui passe stderr en
rouge avec une séquence ANSI...



Pour zsh, quelqu'un avait lancé la discussion dans la mailing-list
zsh-users en juin 2004. Vous pouvez voir dans les archives. Sujet:

coloring STDERR to terminal

Une des premières solutions données par un développeur de zsh:

coproc while read line; print 'e[91m'${(q)line}'e[0m' > /dev/tty
exec 2>&p

Ça permet de voir un peu le genre de choses qu'on peut faire, mais
il y a des effets secondaires: problèmes de bufferisation, problèmes
de contrôle de jobs, ordre dans lequel les données sont envoyées
dans stdout et stderr...

Les choses vont un peu mieux avec:

exec 2>>(while read line; do
print 'e[91m'${(q)line}'e[0m' > /dev/tty; done &)

et un "sleep 0" (ou autre commande externe ne faisant rien) dans
la fonction precmd(). Mais stdout et stderr peuvent toujours se
retrouver désynchronisés, et il y a toujours un problème de buffer
à cause du read line qui doit lire une ligne entière. J'avais fini
avec cette solution:

exec 2>>(colorize `tput bold; tput setaf 1` `tput sgr0` > /dev/tty &)

qui résout un certain nombre de problèmes, mais pas tout.
Le source colorize.c est attaché.

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

--YZ5djTAD1cGYuMQK
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="colorize.c"

/* $Id: colorize.c 8526 2005-08-17 17:32:07Z lefevre $
*
* Colorize the standard input. Written for zsh stderr coloring.
*/

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/types.h>

#define BUFFSIZE 512

static volatile sig_atomic_t usr1;

static void sigusr1(int sig)
{
usr1 = 1;
}

static void writepid(char *tmpfile)
{
FILE *f;

f = fopen(tmpfile, "w");
if (f == NULL)
{
perror("colorize (fopen)");
exit(EXIT_FAILURE);
}
fprintf(f, "%ldn", (long) getpid());
if (fclose(f) != 0)
{
perror("colorize (fclose)");
exit(EXIT_FAILURE);
}
}

int main(int argc, char **argv)
{
pid_t zshpid = 0;
char *begstr, *endstr;
fd_set rfds;
int ret;

if (argc != 3 && argc != 5)
{
fprintf(stderr,
"Usage: colorize <begstr> <endstr> [ <zshpid> <tmpfile> ]n");
exit(EXIT_FAILURE);
}

/* Assume that the arguments are correct. Anyway, it is not possible
to check them entirely. */
begstr = argv[1];
endstr = argv[2];
if (argc == 5)
{
/* To do the synchronization with the zsh prompt output...
Seems to be useless in practice, hence the argc == 3 case. */
zshpid = atol(argv[3]);
signal(SIGUSR1, sigusr1);
writepid(argv[4]);
}

fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);

/* To watch stdin (fd 0). */
FD_ZERO(&rfds);
FD_SET(0, &rfds);

for (;;)
{
ret = select(1, &rfds, NULL, NULL, NULL);

if (ret < 0 && errno != EINTR)
{
perror("colorize (pselect)");
exit(EXIT_FAILURE);
}

if (ret > 0)
{
static unsigned char buffer[BUFFSIZE];
static int dontcol = 0;
ssize_t n;

while ((n = read(0, buffer, BUFFSIZE)) >= 0)
{
ssize_t i;

if (n == 0)
return 0; /* stdin has been closed */
for (i = 0; i < n; i++)
{
if (buffer[i] == 27)
dontcol = 1;
if (buffer[i] == 'n')
dontcol = 0;
if (!dontcol)
fputs(begstr, stdout);
putchar(buffer[i]);
if (!dontcol)
fputs(endstr, stdout);
}
}
fflush(stdout);
}

if (usr1)
{
usr1 = 0;
if (kill(zshpid, SIGUSR1) != 0)
{
perror("colorize (kill)");
exit(EXIT_FAILURE);
}
}
}
}

--YZ5djTAD1cGYuMQK--


--
Pensez à lire la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench

Pensez à rajouter le mot ``spam'' dans vos champs "From" et "Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact