scripts script resueltos programas programacion pasar parametros manejo espaƱol ejercicios ejemplos comandos cadenas linux unix shell scripting

linux - resueltos - scripts bash ejemplos



Detectando el tipo de flujo de salida de un script de shell (4)

Estoy escribiendo un script de shell que usa caracteres de color ANSI en la línea de comando.

Ejemplo: example.sh

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

Mi problema es cuando hago:

$ ./example.sh > out

o

$./example.sh | grep

Los códigos ASCII se enviarán crudos junto con el texto, arruinando la salida y generando caos.

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 aún no he podido encontrar nada específico para 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?


Dentro de un guión 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 un tty o no, usando el indicador -s .

Coloque 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 pruébalo

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

No uso tcsh , pero debe haber una forma de redirigir su salida estándar a la entrada estándar de tty . Si no, usa

sh -c "tty -s <&1"

como su comando de prueba en su script tcsh , verifique su estado de salida y listo.


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.


La detección del tipo de flujo de salida se cubre en la pregunta detectar si el script de shell se ejecuta a través de un conducto .

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 script de ejemplo (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.


Vea esta pregunta SO anterior , 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í está tcsh:

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