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