2009-05-26 12 views
14

Estoy escribiendo un script de shell que usa caracteres de color ANSI en la línea de comandos.Detección del tipo de flujo de salida de un script de shell

Ejemplo: example.sh

#!/bin/tcsh 
printf "\033[31m Success Color is awesome!\033[0m" 

Mi problema es cuando se hace:

$ ./example.sh > out 

o

$./example.sh | grep 

Los códigos ASCII serán enviados junto con la prima texto, arruinando la salida y simplemente causando caos en general.

Me interesa saber si hay una manera de detectar esto para poder deshabilitar el color para este caso especial.

He buscado en las páginas man de tcsh y en la web por un tiempo y todavía no he podido encontrar nada específico de shell.

No estoy obligado a tcsh, es nuestro estándar de grupo ... pero ¿a quién le importa?

¿Es posible detectar, dentro de un script de shell, si su salida está siendo redirigida o canalizada?

+1

* solo * hicimos esto: http://stackoverflow.com/questions/911168/detect-if-shell-script-is-running-through-a-pipe – dmckee

+0

Jaja que es realmente espeluznante que le preguntó cuando en realidad estaba encontrando el problema Acabo de llegar a hacer la pregunta. –

+0

Una relacionada: http://unix.stackexchange.com/q/9957/50602 – Palec

Respuesta

13

Vea este previous SO question, que cubre bash. Tcsh proporciona la misma funcionalidad con filetest -t 1 para ver si la salida estándar es una terminal. Si es así, imprima el material de color, de lo contrario, omítalo. Aquí es tcsh:

#!/bin/tcsh 
if (-t 1) then 
     printf "\033[31m Success Color is awesome!\033[0m" 
else 
     printf "Plain Text is awesome!" 
endif 
+0

csh no es mi lengua materna. perdón por el goof inicial – dwc

-2

Hasta donde yo sé, no hay forma de determinar el destino final de la salida de su script de shell; lo único que puede hacer es proporcionar un interruptor que permita la supresión de los caracteres de control en la salida.

6

Dentro de una secuencia de comandos de shell bourne (sh, bask, ksh, ...), puede alimentar la salida estándar al programa tty (estándar en Unix) que le indica si su entrada es una tty o no, utilizando la bandera -s.

poner lo siguiente en "check-TTY":

#! /bin/sh 
    if tty -s <&1; then 
     echo "Output is a tty" 
    else 
     echo "Output is not a tty" 
    fi 

y probarlo:

% ./check-tty 
    Output is a tty 
    % ./check-tty | cat 
    Output is not a tty 

No consumo tcsh, pero debe haber una manera de redirigir su salida estándar a la entrada estándar de tty. Si no es así, utilice

sh -c "tty -s <&1" 

como su comando de prueba en el script tcsh, comprobar su estado de salida y ya está.

+0

sh -c "tty -s <& 1" siempre devolverá un tty cuando se le llame desde dentro de otro script. Gran respuesta sin embargo. –

+0

No, no lo hará (y acabo de probarlo). –

3

La detección del tipo de flujo de salida está cubierta en la pregunta detect if shell script is running through a pipe.

Después de haber decidido que está hablando con la terminal, puede usar tput para recuperar los códigos de escape correctos para la terminal en particular que esté utilizando, esto hará que el código sea más portátil.

Un ejemplo de secuencia de comandos (en bash me temo, ya que tcsh no es mi fuerte) se da a continuación.

#!/bin/bash 

fg_red= 
fg_green= 
fg_yellow= 
fg_blue= 
fg_magenta= 
fg_cyan= 
fg_white= 
bold= 
reverse= 
attr_end= 

if [ -t 1 ]; then 
    fg_red=$(tput setaf 1) 
    fg_green=$(tput setaf 2) 
    fg_yellow=$(tput setaf 3) 
    fg_blue=$(tput setaf 4) 
    fg_magenta=$(tput setaf 5) 
    fg_cyan=$(tput setaf 6) 
    fg_white=$(tput setaf 7) 
    bold=$(tput bold) 
    reverse=$(tput rev) 
    underline=$(tput smul) 
    attr_end=$(tput sgr0) 
fi 

echo "This is ${fg_red}red${attr_end}" 
echo "This is ${fg_green}green${attr_end}" 
echo "This is ${fg_yellow}yellow${attr_end}" 
echo "This is ${fg_blue}blue${attr_end}" 
echo "This is ${fg_magenta}magenta${attr_end}" 
echo "This is ${fg_cyan}cyan${attr_end}" 
echo "This is ${fg_white}white${attr_end}" 
echo "This is ${bold}bold${attr_end}" 
echo "This is ${reverse}reverse${attr_end}" 
echo "This is ${underline}underline${attr_end}" 

Para obtener más información, consulte "man tput" y "man terminfo" - hay todo tipo de códigos de escape para jugar.

Cuestiones relacionadas