2012-04-10 8 views
5

Recentemente ho trovato un post che ha dato una soluzione per avere l'output di testo da stderr un colore diverso per Linux (bash)Cambiare il testo di colore di uscita sul finestre per stderr

hanno creato lo script seguente script bash

#!/bin/bash 
{ $* 2>&1>&3|sed 's,.*,\x1B[33m&\x1B[0m,'>&2;} 3>&1 

questo fa sì che l'output stampi il testo giallo quando proviene da stderr. lo stdout stampa ancora lo stesso colore.

lo script è stato salvato in una directory in $ PATH denominata colore. Questo mi permette di eseguire la sceneggiatura con make o scons e farà hi-lite tutto il testo da stderr in giallo. (potrebbe rendere il testo rosso cambiando 33m a 31m)

color make CPU=x64 

Questo è abbastanza utile per trovare errori durante la compilazione.

Esiste uno script simile che potrebbe essere utilizzato per la shell di cmd di Windows?

Nota: ho sed installato sul mio computer Windows se ciò è utile.

risposta

6

Per quanto riguarda il supporto per i codici di escape ANSI in cmd.exe di Windows, vedere ansicon. Dopo aver tradotto la logica reindirizzamento a sintassi cmd.exe ho preparato il color.bat seguente file:

@Echo Off 
(((%* 1>&3) 2>&1) | "c:\Program Files (x86)\GnuWin32\bin\sed.exe" "s,.*,\x1B[33m&\x1B[0m," 1>&2) 3>&1 

Purtroppo i corsi d'acqua si mescolano (su alcune linee i personaggi di stdout e stderr sono mescolati insieme in un'unica riga). Forse questo comportamento dipende dalla versione di sed.exe usata, quindi provalo.

Se ciò non funziona, è consigliabile utilizzare l'installazione minima cygwin. Ho testato il tuo script color.sh e sono stato in grado di avviare un file .bat e ha funzionato correttamente senza mescolare i flussi. La sintassi che ho usato era:

./color.sh cmd /c test.bat 
+0

grazie io non sono al mio computer in questo momento, ma ce la metterò una prova e ti faccio sapere – gnash117

+0

Grazie funziona alla grande da quando ho sed nel mio PATH non ho dovuto specificare il percorso completo lasciando @Echo Off (((% * 1> & 3) 2> & 1) | "sed.exe" "s,. *, \ x1B [31m & \ x1B [0m, "1> & 2) 3> & 1 – gnash117

3

ho ideato un metodo per ottenere una soluzione equivalente utilizzando comandi batch puro, cioè senza ANSI, nessun sed.exe, ecc, appena viene utilizzato findstr:

any_command 2>&1 1>&3 | findstr /N /A:4E "^" 

In questo caso il diverso colore non viene assegnato a tutte le righe da stderr, ma solo a un numero di linea fornito da findstr che, tuttavia, dovrebbe essere sufficiente per i requisiti indicati. Scriverò presto un piccolo programma ausiliario .exe che mostrerà intere linee di stderr in un altro colore.

+0

Che cosa significa' & 3' ?? –

+0

Sul mio Win7 questo comando colora le linee ma * solo * output stderr, stdout non è mostrato. –

2

@MBu, @ gnash117

ho rinominato color a co dal COLOR è un comando di Windows ed ho esteso a:

:: color output - Displays stderr output in different color 
:: 
:: Credits to MBu and gnash117 at http://stackoverflow.com/questions/10095886/change-text-output-color-on-windows-for-stderr#10118710 
:: 
:: Requires: 
:: - http://sourceforge.net/projects/mingw/files/MSYS/ 
:: - http://adoxa.altervista.org/ansicon/ 
:: - http://www.autohotkey.com/ 
:: 
@echo off 

if "%1"=="" goto :Help 

:: 1;31 ... intense red foreground (see https://github.com/adoxa/ansicon/blob/master/sequences.txt for more colors) 
:: \x07 ... BEL, but doesn't work :-(
(((%* 1>&3) 2>&1) | sed "s/.*/\x07\x1B[1;31m&\x1B[0m/" 1>&2) 3>&1 
goto :EOF 

:Help 
setlocal 
::------------------------------------------------ 
:: Adapt these in pairs according to your likings 
set invokeKeys=[Shift]+[Enter] 
set invokeHotkeys=+Enter 
set invokeAfterRemoveKeys=[Alt]+[Enter] 
set invokeAfterRemoveHotkeys=!Enter 
set removeKeys=[Alt]+[c] 
set removeHotkeys=!c 
::----------------------------------------------- 
set invokeText=invokes the entered command after preceding it with '%0 ' 
set invokeAfterRemoveText=invokes the entered command after removing the first three characters from the beginning 
set removeText=removes the first three characters from the command line 
echo Colors a command's stderr output as defined in %~f0 
echo Usage: 
echo - Preceed a command with '%0 ' (e.g.: 'co dir not.existing.file' will show the resulting error message in a different color) 
echo - If the AutoHotkey script below is active: 
echo  - %invokeKeys% ... %invokeText% 
echo  - %invokeAfterRemoveKeys% ... %invokeAfterRemoveText% 
echo  - %removeKeys% ... %removeText% 
echo(
echo  The latter two are useful when using the command line history and having used %invokeKeys% before. 
echo(
echo  Enabled by AutoHotkey script: 
echo(
echo  #IfWinActive ahk_class ConsoleWindowClass 
echo  ; %invokeText% 
echo  %invokeHotkeys%::Send {Home}%0 {Enter} 
echo  ; %invokeAfterRemoveText% 
echo  %invokeAfterRemoveHotkeys%::SendInput {Home}{Del 3}{Enter} 
echo  ; %removeText% 
echo  %removeHotkeys%::SendInput {Home}{Del 3}{End} 
echo  #IfWinActive 
endlocal 
:EOF 
+0

Ho finito per nominare lo script hilite (miss incantesimo di evidenziazione) perché mi sono imbattuto nel problema del colore. Mi piace molto lo script però. :) – gnash117

Problemi correlati