Estoy viendo la salida de mi comando complicado less
, el problema es que stderr
se pierde. stderr
las líneas normalmente se enumeran entre stdout
lí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 tee
y multitee
hasta ahora no he tenido suerte.
stderr
se redirige astdout
, toda la salida astderr
se mezclará con la salida normal activadastdout
. La canalización de esa salidaless
mostrará ambos.less
para volver a pintar la pantalla.Respuestas:
Tal vez
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ó:
y, en un comentario para quienes respondieron temprano, escribió:
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
cualquier mensaje de error (por ejemplo, permisos de directorio) aparece así en menos
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
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.
fuente
Tienes que redirigir
stderr
astdout
:Consulte el manual de su shell (p
man bash
. Ej .)fuente
solo dígale al shell que redirija fd 2 a fd 1 (stderr a stdout)
fuente
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
stderr
yless
muestra la salida desdestdout
el terminal. Siless
comienza a mostrarse después de que toda la salidastderr
ha sido impresa en el terminal, laless
conservará y podrá ver los mensajes después de salirless
. OTOH siless
ya ha comenzado a mostrar cosas, los mensajes de error se entremezclan conless
la salida y no se conserva nada después de lasless
salidas (porqueless
solo 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
Todos los mensajes de error "Permiso denegado" se mezclan con la
less
salida y no habrá nada después de salir. Si lo hacesTodos (o al menos la mayoría) de los mensajes de error se han impreso en el terminal antes de tener la
less
oportunidad 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 comosleep 0.1
es 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).fuente
Debe comprender el concepto de "descriptores de archivo". Por lo general, una aplicación de Unix comenzará con tres descriptores de archivo especiales:
La "tubería"
|
en el shell se conectastdout
de un proceso constdin
el siguiente.Los errores son, por diseño, no alimentados al
stdin
siguiente 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 ejemploTambién debe incluir la salida de error de archivos inaccesibles.
solo le dará los errores.
fuente
Estoy confundido acerca de su pregunta, por lo que puedo decir, su comportamiento deseado es el predeterminado.
Cuando uso
para obtener una prueba simple,
hace exactamente lo que pides. Eso es lo que veo
en
less
ycuando dejé
less
fuente
echo info ; echo error 1>&2
) y repita la prueba: ambas líneas se canalizan a menos.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.
fuente