РЕДАКТИРОВАТЬ:
То, что вы просите, невозможно:
- Без исправления
bash
, невозможно отделить bash's -v
вывод из stderr вашей программы - Даже если бы это было возможно, разделенные выходы не могли бы быть легко синхронизированы повторно, поэтому вы не смогли бы раскрасить каждую строку сразу после ее вывода.
Единственный способ легко получить то, что вы хотите, - это
- Адаптировать ваш скрипт так, чтобы каждая строка могла быть индивидуально получена (это допустимая командная строка bash)
- Создайте скрипт-обёртку, который построчно читает ваш скрипт и вычеркивает его после его раскрашивания.
Мой оригинальный ответ (приведенный ниже) использует обходной путь, который делает то, что вы хотите, но с оговоркой группировкивесь цветной вывод в одном блоке (и вы хотите, чтобы каждая строка была раскрашена по мере выполнения).
ORIGINAL:
Поскольку в настоящее время нет способателефонling bash использовать другой дескриптор для вывода -v
, так что вы не можете отделить его от stderr вашего скрипта.
Если вы хотите добиться, это выделить только вывод -v
(а не stderr)), единственный способ добиться этого - настроить скрипт для разделения потоков вручную:
- Добавить
exec 2>&3
в качестве первой инструкции в вашем скрипте, - Обернутьостальной код в
{ ... ; } 2>&4
блоке - вызов
bash -v newscript 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2
Если вы хотите, чтобы оболочка делала все это автоматически, вы можете использовать это:
bash -v <(printf %s\\n 'exec 2>&3' '{'; cat script; printf %s\\n '' '} 2>&4') 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2
или если вы echo
поклонник:
bash -v <(echo $'exec 2>&3\n{'; cat script; echo $'\n} 2>&4') 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2
- (обратите внимание, что часть
''
во втором printf
предназначена для обработки сценариев, которые не имеютзавершающий перевод строки) - Обязательно используйте другие FD, кроме
3
и 4
, если ваш сценарий должен их использовать