[Bash] echo que salidas a stderr


Answers

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 tiene dependencias.

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

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

La solución de Glenn Jackman también evita el problema de deglución de argumentos:

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

¿Hay una herramienta Bash estándar que actúe como eco pero que produzca 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 incorrectamente cuando cambian las cosas).




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

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

saldrá efectivamente a stderr . Explicación: /proc/self es un enlace al proceso actual y /proc/self/fd contiene el proceso abierto descriptores de archivo. Entonces, 0 , 1 y 2 significan 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 script

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

esa sería tu herramienta.

O realice una función si no desea tener un script en un archivo separado.




Otra opción

echo foo >>/dev/stderr



Esta es una función STDERR simple, que redirige la entrada de 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



No use cat ya que algunos se mencionan aquí. cat es un programa, mientras que echo y printf son builtins bash (shell). Lanzar un programa u otro script (también mencionado anteriormente) significa crear un nuevo proceso con todos sus costos. Al usar las instrucciones internas, las funciones de escritura son bastante baratas, porque no es necesario crear (ejecutar) un proceso (-entorno).

El opner pregunta "¿hay alguna herramienta estándar para dar salida ( tubería ) a stderr", la respuesta schort es: NO ... ¿por qué? ... la redirección de tuberías es un concepto elemental en sistemas como Unix (Linux ...) y Bash (sh) se basa en estos conceptos.

Estoy de acuerdo con el abridor que redirige con anotaciones 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, sino ayudar a los administradores a trabajar allí con menos teclados ;-)

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



Links



Tags