¿Existe una herramienta Bash estándar que actúe como eco pero que se envíe a stderr en lugar de stdout?
Sé que puedo hacerlo, echo foo 1>&2
pero es un poco feo y, sospecho, propenso a errores (por ejemplo, es más probable que se edite mal cuando las cosas cambian).
Respuestas:
Podrías hacer esto, lo que facilita la lectura:
>&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 número 2 al que originalmente se refería. Para obtener más información, consulte el Tutorial ilustrado de redireccionamiento de Bash Hackers .fuente
alias
de un script de shell. Probablemente sería más seguro usarloerrcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
no funcionará. Para hacer algo así, tendrá que colocar la redirección en algún lugar después de la última tubería como:errcho(){ echo $@|>&2 pr -To5;}
Podrías definir una función:
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 aquí" e imprimirá todo lo que le pase, incluidos los argumentos (-n) que el eco normalmente se tragaría:
La solución de Glenn Jackman también evita el problema de tragar el argumento:
fuente
echoerr -ne xt
no va a imprimir "-ne xt". Mejor usoprintf
para eso.echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
espacios en blanco se envía como un argumento separado, que en el caso deecho
concatenarlos con0x20
s, pero los peligros de no citar mucho más que la conveniencia de escribir 2 caracteres menos) .Como
1
es la salida estándar, no tiene que nombrarla explícitamente delante de una redirección de salida como,>
sino que simplemente puede escribir:Dado que parece preocupado porque
1>&2
le resultará difícil escribir de manera confiable, ¡la eliminación del redundante1
podría ser un pequeño estímulo para usted!fuente
Otra opción
fuente
foo
- tiene su propia stderr redirigido - por ejemplofoo >foo.log 2>&1
- a continuación,echo foo >/dev/stderr
se clobber toda la salida antes de ella.>>
debería usarse en su lugar:echo foo >>/dev/stderr
/dev/fd/2
./proc/self/fd/2
. Vea mi respuesta a continuación :)No, esa es la forma estándar de hacerlo. No debería causar errores.
fuente
1>&2
. Todos deseamos que esto no suceda, pero estoy seguro de que todos hemos estado en lugares donde sucede.( echo something 1>&2 ; something else ) > log
->(echo something; cp some junk 1>&2 ; something else) > log
Vaya.Si no le importa registrar el mensaje también en syslog, la forma no_so_ fea es:
La opción -s significa: "Enviar el mensaje al error estándar, así como al registro del sistema".
fuente
Esta es una función STDERR simple, que redirige la entrada de la tubería a STDERR.
fuente
echo what | /dev/stderr
...Nota: estoy respondiendo la pregunta posterior, no la pregunta confusa / vaga "echo que sale a stderr" (ya respondida por OP).
Use una función para mostrar la intención y obtener la implementación que desea. P.ej
Y
error_handling
siendo:Razones que manejan las preocupaciones en OP:
Otras razones:
fuente
Mi sugerencia:
o
echo "my errz" > /proc/self/fd/2
lo hará de manera efectiva a la salidastderr
, porque/proc/self
es un enlace con el proceso actual, y/proc/self/fd
ejerce en el proceso abierto descriptores de archivo, y luego,0
,1
, y2
representarstdin
,stdout
ystderr
respectivamente.El
/proc/self
enlace no funciona en MacOS, sin embargo,/proc/self/fd/*
está disponible en Termux en Android, pero no/dev/stderr
. ¿Cómo detectar el sistema operativo desde un script Bash? puede ayudar si necesita hacer que su script sea más portátil determinando qué variante usar.fuente
/proc/self
enlace no funciona en MacOS, así que me quedaré con el/dev/stderr
método más directo . Además, como se señaló en otras respuestas / comentarios, probablemente sea mejor usarlo>>
para agregar./proc/self/fd/*
está disponible en Termux en Android, pero no/dev/stderr
.No lo use,
cat
ya que algunos se mencionan aquí.cat
es un programa whileecho
yprintf
son bash (shell) integradas. Lanzar un programa u otro script (también mencionado anteriormente) significa crear un nuevo proceso con todos sus costos. Usando las funciones integradas, las funciones de escritura son bastante baratas, porque no hay necesidad de crear (ejecutar) un proceso (entorno).El operador pregunta "¿hay alguna herramienta estándar para enviar ( tubería ) a stderr", la respuesta corta es: NO ... ¿por qué? ... redirigir 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 de que la redirección con anotaciones como esta:
&2>1
no es muy agradable para los programadores modernos, pero eso es bash. Bash no estaba destinado a escribir programas grandes y robustos, está destinado a ayudar a los administradores a llegar a trabajar con menos pulsaciones de teclas ;-)Y al menos, puede colocar la redirección en cualquier lugar de la línea:
fuente
cat
y ordenarle a alguien que no use cat porque es lento. Hay innumerables casos de uso en los que cat es la elección correcta, por eso me opongo a su respuesta.echo
reemplazo. Incluso si usacat
, tiene que usar un redireccionamiento bash. de todas formas. Entonces, no tiene ningún sentido usarcat
aquí. Por cierto, usocat
100 veces al día, pero nunca en el contexto que el abridor pidió ... ¿lo entendiste?Otra opción con la que me topé recientemente es esta:
Esto usa solo las funciones integradas de Bash mientras hace que la salida de error de varias líneas sea menos propensa a errores (ya que no tiene que acordarse de agregar
&>2
a cada línea).fuente
cat
o cualquier otra utilidad, lo cual está fuera del tema de la pregunta.read
es un comando integrado de shell que imprime en stderr, y se puede usar como echo sin realizar trucos de redireccionamiento:El
-t 0.1
es un tiempo de espera que deshabilita la funcionalidad principal de lectura, almacenando una línea de stdin en una variable.fuente
Hacer un guion
Esa sería tu herramienta.
O haga una función si no desea tener un script en un archivo separado.
fuente
Solución combinada sugerida por James Roth y Glenn Jackman
fuente
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 en un error estándar usando Perl:
fuente