Я спробую проаналізувати наступну частину вашого питання:
замість цього буде виглядати приблизно так:
~ $ деяка команда
деяка корисна інформація про вихід |
більше вихід | ПОМИЛКА: помилка
інше повідомлення | ПОМИЛКА: сталася
~ $
Якщо ви хочете розбити те, що ви хочете, це:
1) stdoutПотік не закінчуватиме кожен рядок знаком " CR LFа", а "" характер. Це, звичайно, не вирівняло б два потоки разом, і вирівнювання не підлягає сумніву, оскільки воно повинно було б передбачити довжину майбутніх рядків, доданих до stdout, що, звичайно, неможливо.
2) Припускаючи, що ми забули про вирівнювання, ми б просто виводили stderrпісля того, як буде оброблений трубопроводом, який додає "ПОМИЛКА:" на початок кожного рядка. Я вважаю, що це досить просто, створивши простий сценарій і переконайтеся, що stderrзавжди виходить за допомогою цього сценарію.
Але це створило б такий результат:
~ $ деяка команда
деяка корисна інформація про вихід |
більше вихід | ПОМИЛКА: помилка
інше повідомлення | ПОМИЛКА: сталася
Що насправді не корисно, чи не так? Також не вірю, це те, за чим ти теж піклується!
Проблема з початковим питанням, я думаю, полягає в тому, що ви не враховуєте послідовний характер кожного рядка, доданого в потік, у зв'язку з тим, що обидва потоки можуть бути записані асинхронно.
Я вважаю, що найближчим можливим рішенням буде використання ncurses.
Побачити.
[ http://www.tldp.org/HOWTO/html_single/NCURSES-Programming-HOWTO/]
[ http://invisible-island.net/ncurses/ncurses-intro.html#updating]
Для того, щоб робити те, що є після того, як вам потрібно буферувати обидва потоки та об'єднати їх для отримання третього буфера, який бере елементи з обох буферів. Потім скидайте третій буфер на екран терміналу, видаляючи екран терміналу та перефарбовуючи його щоразу, коли третій буфер змінюється. Але це так і ncursesпрацює, тож навіщо винаходити колесо, а не брати його звідти?
У будь-якому випадку, вам доведеться перейняти те, що екран терміналу повністю пофарбований ! І вирівняйте текст у передрукованій версії екрану так, як вам подобається. Наче подібна відеоігра з термінальними символами.
Я сподіваюся, що моя відповідь буде корисною для уточнення обмежень того, що ви маєте після ...
Вибачте за повторення цього, але найбільшою проблемою з того, що ви показали, є те, як «процесор» stdoutі stderrпотоки заздалегідь знатимуть довжину доданих до нього майбутніх рядків, щоб правильно їх вирівняти.