mac escape color change bashrc bash

escape - colors bash prompt



eco que da salida a stderr (13)

¿Existe una herramienta estándar de Bash que actúe como eco pero que salga a stderr en lugar de stdout?

Sé que puedo hacer echo foo 1>&2 pero es algo feo y, sospecho, propenso a errores (por ejemplo, es más probable que se edite mal cuando las cosas cambian).


Dado que 1 es la salida estándar, no tiene que nombrarlo explícitamente delante de una redirección de salida como > sino que simplemente puede escribir:

echo This message goes to stderr >&2

Ya que parece que le preocupa que 1>&2 le resulte difícil escribir de manera confiable, ¡la eliminación del redundante 1 podría ser un leve estímulo para usted!


Esta es una función STDERR simple, que redirige la entrada de la tubería a STDERR.

#!/bin/bash # ************************************************************* # This function redirect the pipe input to STDERR. # # @param stream # @return string # function STDERR () { cat - 1>&2 } # remove the directory /bubu if rm /bubu 2>/dev/null; then echo "Bubu is gone." else echo "Has anyone seen Bubu?" | STDERR fi # run the bubu.sh and redirect you output tux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err


Esta pregunta es antigua, pero puedes hacer esto, lo que facilita la lectura:

>&2 echo "error"

El operador >&2 significa literalmente redireccionar la dirección del descriptor de archivo 1 ( stdout ) a la dirección del descriptor de archivo 2 ( stderr ) para ese comando 1 . Dependiendo de qué tan profundamente quiera entenderlo, lea esto: http://wiki.bash-hackers.org/howto/redirection_tutorial

Para evitar la interacción con otras redirecciones use subshell.

(>&2 echo "error")

1 >&2 copia el descriptor de archivo # 2 al descriptor de archivo # 1. Por lo tanto, después de realizar esta redirección, ambos descriptores de archivo se referirán al mismo archivo: el descriptor de archivo # 2 originalmente se refería.


Esto ya ha sido respondido y con muchos votos. Solo para que conste:

echo "my errz" > /proc/self/fd/2

efectivamente se hará salir a stderr . Explicación: /proc/self es un enlace al proceso actual y /proc/self/fd contiene el proceso abierto de descriptores de archivos. Luego, 0 , 1 y 2 siglas de stdin , stdout y stderr respectivamente.

Lo encontré más legible. También esto puede funcionar en la mayoría de las distribuciones de Linux:

echo "my errz" > /dev/stderr

Haciéndolo mucho más legible.


Hacer un guion

#!/bin/sh echo $* 1>&2

Esa sería tu herramienta.

O haga una función si no quiere tener un script en un archivo separado.


No use cat como algunos se mencionan aquí. cat es un programa, mientras que echo y printf son bash (shell) builtins. Lanzar un programa u otro script (también mencionado anteriormente) significa crear un nuevo proceso con todos sus costos. Usando builtin, las funciones de escritura son bastante baratas, porque no hay necesidad de crear (ejecutar) un proceso (-environment).

El opner pregunta: "¿hay alguna herramienta estándar para enviar ( tubería ) a stderr?" ... rediredcting pipe es un concepto fundamental en sistemas como Unix (Linux ...) y bash (sh) se basa en estos conceptos.

Estoy de acuerdo con la apertura de que la redirección con notaciones como esta: &2>1 no es muy agradable para los programadores modernos, pero eso es bash. Bash no tenía la intención de escribir programas grandes y robustos, estaba destinado a ayudar a los administradores a lograr que funcionen con menos pulsaciones de teclas ;-)

Y al menos, puede colocar la redirección en cualquier lugar de la línea:

$ echo This message >&2 goes to stderr This message goes to stderr


No, esa es la forma estándar de hacerlo. No debería causar errores.


Otra opción

echo foo >>/dev/stderr


Podrías definir una función:

echoerr() { echo "$@" 1>&2; } echoerr hello world

Esto sería más rápido que un script y no tendría dependencias.

La sugerencia específica de bash de Camilo Martin utiliza una "cadena de aquí" e imprimirá todo lo que le pases, incluidos los argumentos (-n) que el eco normalmente tragaría:

echoerr() { cat <<< "$@" 1>&2; }

La solución de Glenn Jackman también evita el problema de tragar el argumento:

echoerr() { printf "%s/n" "$*" >&2; }


Si no le importa registrar el mensaje también en syslog, la forma de not_so_ugly es:

logger -s $msg

La opción -s significa: "Enviar el mensaje a un error estándar así como al registro del sistema".


read es un comando incorporado en la shell que se imprime en stderr, y se puede usar como eco sin realizar trucos de redirección:

read -t 0.1 -p "This will be sent to stderr"

El -t 0.1 es un tiempo de espera que deshabilita la funcionalidad principal de lectura, almacenando una línea de entrada estándar en una variable.


Mac OS X: probé la respuesta aceptada y un par de otras respuestas y todas resultaron en escribir STDOUT no STDERR en mi Mac.

Aquí hay una forma portátil de escribir un error estándar usando Perl:

echo WARNING! | perl -ne ''print STDERR''


Nota: Estoy respondiendo la pregunta post-no el "eco que induce a error / impreciso a stderr" (ya contestada por OP).

Utilice una función para mostrar la intención y la fuente de la implementación que desea. P.ej

#!/bin/bash [ -x error_handling ] && . error_handling filename="foobar.txt" config_error $filename "invalid value!" output_xml_error "No such account" debug_output "Skipping cache" log_error "Timeout downloading archive" notify_admin "Out of disk space!" fatal "failed to open logger!"

Y error_handling siendo:

ADMIN_EMAIL=root@localhost config_error() { filename="$1"; shift; echo "Config error in $filename: $*" 2>&1; } output_xml_error() { echo "<error>$*</error>" 2>&1; } debug_output() { [ "$DEBUG"=="1" ] && echo "DEBUG: $*"; } log_error() { logger -s "$*"; } fatal() { which logger >/dev/null && logger -s "FATAL: $*" || echo "FATAL: $*"; exit 100; } notify_admin() { echo "$*" | mail -s "Error from script" "$ADMIN_EMAIL"; }

Razones que manejan preocupaciones en OP:

  • La mejor sintaxis posible (palabras significativas en lugar de símbolos feos)
  • Es más difícil cometer un error (especialmente si reutiliza el script)
  • no es una herramienta Bash estándar, pero puede ser una biblioteca de shell estándar para usted o su empresa / organización

Otras razones:

  • claridad - muestra intención a otros mantenedores
  • velocidad - las funciones son más rápidas que los scripts de shell
  • reutilización - una función puede llamar a otra función
  • Configurabilidad - no es necesario editar el script original
  • depuración: es más fácil encontrar la línea responsable de un error (especialmente si está perdiendo el tiempo con una tonelada de salida de redireccionamiento / filtrado)
  • robustez: si falta una función y no puede editar el script, puede recurrir a la utilización de una herramienta externa con el mismo nombre (por ejemplo, log_error puede asociarse al registrador en Linux)
  • cambio de implementaciones: puede cambiar a herramientas externas eliminando el atributo "x" de la biblioteca
  • agnóstico de salida: ya no tiene que preocuparse si va a STDERR o a otro lugar
  • Personalización: puede configurar el comportamiento con variables de entorno.