Linux menos comportamiento y stderr

11

Estoy viendo la salida de mi comando complicado less, el problema es que stderrse pierde. stderrlas líneas normalmente se enumeran entre stdoutlíneas dentro less. Me gustaría que se imprimieran en la consola, y cuando salga less, para verlos allí juntos.

Me doy cuenta de que podría no haber una solución a esto, leí acerca de esto teey multiteehasta ahora no he tenido suerte.

haelix
fuente
2
Me estás diciendo cómo redirigir stderr a stdout, pero eso no es lo que quería. No quiero que stderr se mezcle con stdout dentro de menos. Me gustaría que stderr esté en la terminal cuando salga menos.
Si stderrse redirige a stdout, toda la salida a stderr se mezclará con la salida normal activada stdout. La canalización de esa salida lessmostrará ambos.
Algún tipo programador el
Si ignoro "stderr para estar en la terminal cuando salgo menos", sugiero presionar Ctrl-L lesspara volver a pintar la pantalla.
kamae

Respuestas:

10

Tal vez

command 2> command.err | less; cat command.err; rm command.err

Apéndice

A continuación se presenta una aclaración para las personas que no leen cuidadosamente la pregunta y que no leyeron el comentario aclaratorio del OP anterior.

haelix señaló:

Las líneas stderr normalmente se enumeran entre las líneas stdout dentro de menos

y, en un comentario para quienes respondieron temprano, escribió:

Me estás diciendo cómo redirigir stderr a stdout, pero eso no es lo que quería. No quiero que stderr se mezcle con stdout dentro de menos. Me gustaría que stderr esté en la terminal cuando salga menos

El problema probablemente sea específico de la plataforma, ciertamente es algo que he experimentado en plataformas Unix SVR4 más antiguas.

Si, en tales plataformas, haces algo como

 find / ... | less

cualquier mensaje de error (por ejemplo, permisos de directorio) aparece así en menos

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

para que las líneas de salida estén oscurecidas por mensajes de error.

Si actualiza la página, las líneas de salida se muestran correctamente pero pierde los mensajes de error. Cuando salga menos, la pantalla se borrará excepto por un símbolo del sistema.

Si haces algo como

  find / ... 2>&1 | less

Los mensajes de error se entremezclan con la salida estándar. De nuevo, cuando salga menos, la pantalla estará vacía.

Si primero desea examinar solo la salida estándar en menos, luego ver los mensajes de error después de salir menos, necesita una solución diferente.

Eso es lo que sugería tentativamente en mi respuesta original de dos líneas.

RedGrittyBrick
fuente
Esto es basura. La respuesta de Joaquín debería ser la aceptada.
Vanilla Face
2
@VanillaFace: agregué material aclaratorio a mi respuesta.
RedGrittyBrick
15

Tienes que redirigir stderra stdout:

$ ./somecommad 2>&1 | less

Consulte el manual de su shell (p man bash. Ej .)

Algún tipo programador
fuente
1
Comentario para nuevos lectores de esta vieja pregunta (no para Joachim en particular) Esto es lo que todos piensan en el primer análisis de la pregunta. Pero el problema es más sutil: vea la discusión en los comentarios después de la respuesta de
dmckee
1

solo dígale al shell que redirija fd 2 a fd 1 (stderr a stdout)

 make 2>&1 | less
Jackdoe
fuente
1

Una cosa que faltaba en todas las respuestas hasta ahora es la razón, por qué esto está sucediendo. El problema aquí es algún tipo de condición de carrera entre el proceso que genera cosas stderry lessmuestra la salida desde stdoutel terminal. Si lesscomienza a mostrarse después de que toda la salida stderrha sido impresa en el terminal, la lessconservará y podrá ver los mensajes después de salir less. OTOH si lessya ha comenzado a mostrar cosas, los mensajes de error se entremezclan con lessla salida y no se conserva nada después de las lesssalidas (porque lesssolo conserva el terminal como estaba antes de que comenzara y no sabe nada sobre los mensajes de error que se interpusieron).

Puede ver eso fácilmente, si lo hace, por ejemplo

grep foo -r /etc | less

Todos los mensajes de error "Permiso denegado" se mezclan con la lesssalida y no habrá nada después de salir. Si lo haces

grep foo -r /etc | (sleep 10; less)

Todos (o al menos la mayoría) de los mensajes de error se han impreso en el terminal antes de tener la lessoportunidad de mostrar la salida y luego verá los mensajes de error.

Por supuesto, generalmente no desea esperar 10 segundos antes de comenzar less, pero con Linux también puede proporcionar valores fraccionales para el tiempo de espera, y con procesos de ejecución rápida a menudo, algo tan poco como sleep 0.1es suficiente para evitar la condición de carrera. (Pero, por supuesto, si quiere o tiene que estar del lado realmente seguro, use la solución de RedGrittyBrick).

Elmar Zander
fuente
0

Debe comprender el concepto de "descriptores de archivo". Por lo general, una aplicación de Unix comenzará con tres descriptores de archivo especiales:

  • Entrada estándar
  • Salida estándar
  • Error estándar

La "tubería" |en el shell se conecta stdoutde un proceso con stdinel siguiente.

Los errores son, por diseño, no alimentados al stdinsiguiente proceso. A menudo no tendrán sentido para la próxima aplicación, y no deben ocultarse al usuario.

Si desea mezclar los errores en stdout, puede usar 2>&1, por ejemplo , lo que dice esencialmente "agregar stderr a stdout". Por ejemplo

find /etc 2>&1 | less

También debe incluir la salida de error de archivos inaccesibles.

find /etc 2>&1 >/dev/null | less

solo le dará los errores.

HA SALIDO - Anony-Mousse
fuente
0

Estoy confundido acerca de su pregunta, por lo que puedo decir, su comportamiento deseado es el predeterminado.

Cuando uso

#include <stdio.h>

int main(int argc, char**argv){
  for (int j=0; j<10; ++j){
    fprintf( (j%2 ? stdout : stderr) , "%d\n" , j);
  }
  return 0;
}

para obtener una prueba simple,

$ ./testredirection | less

hace exactamente lo que pides. Eso es lo que veo

1
3
5
7
9
(END) 

en lessy

$ ./testredirection | less
0
2
4
6
8
$ 

cuando dejé less

dmckee --- gatito ex moderador
fuente
Es extraño, pero las cosas no siempre son así. Pruebe con un script ( echo info ; echo error 1>&2) y repita la prueba: ambas líneas se canalizan a menos.
cYrus
@cYrus: Eso también funciona como se esperaba para mí. Por supuesto que lo probé en una caja de Mac OS. Bash 3.2.17, menos 394. Quizás algo específico de Linux. En cualquier caso, el enfoque de RedGrittyBrick debería funcionar bien.
dmckee --- ex-gatito moderador
¡Extraño! Debian Squeeze / Bash 4.1.5 / Menos 436
cYrus
Sí, abrí un shell de la caja Scientific Linux 5.3 en el trabajo y obtuve el comportamiento esperado con bash 3.0.15 y menos 382. ¿Podría haber una regresión allí?
dmckee --- ex-gatito moderador
No sé, creo que es solo una cuestión de amortiguación.
cYrus
0

Me encuentro con este problema recientemente en uno de mis Debian 5.0. por ejemplo, ls abc | menos me parece que el mensaje de error entra en menos, lo que en mi opinión.

Después de algunos intentos, descubrí que es solo algo relacionado con los buffers de pantalla. stderr NO entra en menos en realidad. Puede usar las teclas de flecha arriba o abajo (o j / k) para demostrar.

Baya
fuente