Estoy buscando una manera de separar visualmente stdout y stderr, para que no se intercalen y puedan identificarse fácilmente. Idealmente, stdout y stderr tendrían áreas separadas en la pantalla en la que se muestran, por ejemplo, en diferentes columnas. Por ejemplo, salida que se vería así:
~$ some command
some useful output info
ERROR: an error
more output
ERROR: has occurred
another message
~$
en su lugar se vería algo así:
~$ some command |
some useful output info |
more output | ERROR: an error
another message | ERROR: has occurred
~$ |
command-line
terminal
Zoey Hewll
fuente
fuente
Respuestas:
Puede usar
screen
la función de división vertical de GNU :Para usar por ejemplo como:
La idea es que ejecuta la pantalla con un archivo de configuración temporal que inicia dos ventanas de pantalla en un diseño dividido vertical. En el primero, ejecutamos su comando con el stderr conectado al segundo.
Usamos una tubería con nombre para la segunda ventana para comunicar su dispositivo tty a la primera, y también para que la primera le diga a la segunda cuando se complete el comando.
La otra ventaja en comparación con los enfoques basados en tuberías es que stdout y stderr del comando todavía están conectados a dispositivos tty, por lo que no afecta el almacenamiento en búfer. Ambos paneles también se pueden desplazar hacia arriba y hacia abajo de forma independiente (utilizando
screen
el modo de copia).Si ejecuta un shell de forma
bash
interactiva con ese script, notará que el indicador se mostrará en la segunda ventana, mientras que el shell leerá lo que escriba en la primera ventana a medida que esos shells muestren su indicador en stderr.En el caso de
bash
, el eco de lo que escribe también aparecerá en la segunda ventana a medida que ese eco es emitido por el shell (readline en el caso debash
) también en stderr. Con algunas otras conchas les gustaksh93
, se mostrará en la primera ventana ( eco de salida por el controlador de dispositivo de terminal, no la cáscara), a menos que poner la cáscara enemacs
ovi
modo conset -o emacs
oset -o vi
.fuente
Esta es una solución fea basada en el
annotate-output
script de Debian ANNOTATE-OUTPUT (1) . No estoy seguro de si esto es lo que está buscando, pero podría ser algo para comenzar:Puedes probarlo usando
./this_script another_script
ocommand
.fuente
Intentaré analizar la siguiente parte de su pregunta:
Si uno quisiera desglosar lo que quiere es:
1) La
stdout
secuencia no terminaría cada líneaCR LF
con un "|" personaje. Por supuesto, esto no alinearía las dos corrientes, y la alineación está fuera de discusión porque tendría que predecir la longitud de las líneas futuras agregadas a lastdout
, que por supuesto es imposible.2) Suponiendo que nos olvidemos de la alineación, simplemente generaríamos el resultado
stderr
después de ser procesado por una tubería que agrega "ERROR:" al comienzo de cada línea. Supongo que esto es bastante fácil al hacer un guión simple y asegurarse de questderr
siempre salga a través de este guión.Pero eso crearía una salida como esta:
¿Qué no es realmente útil, verdad? Además, no creo, ¡es lo que buscas también!
Creo que el problema con la pregunta inicial es que no se tiene en cuenta la naturaleza en serie de cada línea agregada en una secuencia, en relación con el hecho de que ambas secuencias pueden escribirse de forma asíncrona.
Creo que la solución más cercana posible sería usar
ncurses
.Ver.
[ http://www.tldp.org/HOWTO/html_single/NCURSES-Programming-HOWTO/]
[ http://invisible-island.net/ncurses/ncurses-intro.html#updating]
Para hacer lo que está haciendo, necesita almacenar ambas secuencias y combinarlas para producir una tercera memoria intermedia que tome elementos de ambas memorias intermedias. Luego, descargue el tercer búfer en la pantalla del terminal borrando la pantalla del terminal y repintando cada vez que cambie el tercer búfer. Pero así es como
ncurses
funciona, entonces ¿por qué reinventar la rueda y no levantarla desde allí?En cualquier caso, ¡tendría que asumir la forma en que la pantalla del terminal está pintada por completo ! Y vuelva a alinear el texto en la versión reimpresa de la pantalla a su gusto. Al igual que un videojuego con personajes terminales.
Espero que mi respuesta sea útil para aclarar las limitaciones de lo que buscas ...
Disculpe por repetir esto, pero el mayor problema con lo que mostró es cómo sabrá el "procesador" de las secuencias
stdout
ystderr
de antemano la longitud de las líneas futuras agregadas para alinearlas correctamente.fuente