Я ищу способ визуально разделить stdout и stderr, чтобы они не чередовались и чтобы их можно было легко идентифицировать. В идеале stdout и stderr должны иметь отдельные области на экране, в которых они отображаются, например, в разных столбцах. Например, вывод, который выглядел бы так:
~$ some command
some useful output info
ERROR: an error
more output
ERROR: has occurred
another message
~$
вместо этого будет выглядеть примерно так:
~$ some command |
some useful output info |
more output | ERROR: an error
another message | ERROR: has occurred
~$ |
command-line
terminal
Зои Хьюлл
источник
источник
Ответы:
Вы можете использовать
screen
функцию вертикального разделения GNU :Использовать, например, как:
Идея состоит в том, что он запускает экран с временным файлом конфигурации, который запускает два окна экрана в вертикальной раскладке. В первом случае мы запускаем вашу команду с подключенным stderr ко второму.
Мы используем именованный канал для второго окна, чтобы сообщить свое tty-устройство первому, а также для первого, чтобы сообщить второму, когда команда выполнена.
Другое преимущество по сравнению с конвейерным подходом состоит в том, что команды stdout и stderr по-прежнему подключены к tty-устройствам, поэтому это не влияет на буферизацию. Обе панели также можно прокручивать вверх и вниз независимо (в
screen
режиме копирования).Если вы запустите оболочку в
bash
интерактивном режиме с этим сценарием, вы заметите, что подсказка будет отображаться во втором окне, а оболочка будет читать то, что вы вводите в первом окне, когда эти оболочки выводят свою подсказку на stderr.В случае
bash
, эхо того, что вы вводите, также появится во втором окне, так как это эхо выводится оболочкой (readline в случаеbash
) также на stderr. С некоторыми другими оболочками, такими какksh93
, он будет отображаться в первом окне ( вывод эха драйвером оконечного устройства, а не оболочкой), если вы не включили оболочкуemacs
илиvi
режим с помощьюset -o emacs
илиset -o vi
.источник
Это уродливое решение, основанное на
annotate-output
сценарии Debian ANNOTATE-OUTPUT (1) . Не уверен, что это то, что вы ищете, но с чего можно начать:Вы можете проверить это с помощью
./this_script another_script
илиcommand
.источник
Я постараюсь проанализировать следующую часть вашего вопроса:
Если кто-то хочет разбить то, что вы хотите:
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
потоки заранее знать длину линий будущих добавленных к нему для того , чтобы выровнять их должным образом.источник