Bash предоставляет опцию -v--verbose, которая записывает команду при чтении в stderr.
Необходимо выделить этот вывод.
Текущее решение
bash -v script 2> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2)
выделить все в stderr.
Итак, проблема в том, чтобы отделить вывод -v от другого stderr.
Добавление.
bash имеет BASH_XTRACEFD, который можно использовать для выделения вывода -x (xtrace).
Обновление: такое перенаправление также нарушает последовательность команды / ответа - ответы могут появляться перед командами. Таким образом, текущее решение - НЕ выделять вообще ничего.
Upd2 .: Было бы неплохо использовать expect - программный диалог с интерактивными программами.
это выделит все, что было передано в stderr. Как и мое текущее простое уродливое решение :(





Обновлено:
То, о чем вы просите, невозможно:
bash невозможно отделить вывод -v bash от stderr вашей программы.Единственный способ легко получить желаемое - это
В моем исходном ответе (приведенном ниже) используется обходной путь, который делает то, что вы хотите, но с оговоркой о группировке всего раскрашенного вывода в один блок (и вы хотите, чтобы каждая строка была раскрашена по мере ее выполнения).
ОРИГИНАЛ:
Поскольку в настоящее время нет способа указать bash использовать другой дескриптор для вывода -v, поэтому вы не можете отделить его от stderr вашего скрипта.
Если вы хотите выделить только вывод -v (а не stderr), единственный способ добиться этого - настроить сценарий для разделения потоков вручную:
exec 2>&3 в качестве первой инструкции в вашем скрипте,{ ... ; } 2>&4bash -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 предназначена для обработки сценариев, у которых нет завершающей новой строки)3 и 4, если ваш скрипт должен их использовать.Спасибо за ответ. Bash читает содержимое в скобках как одну команду. Итак, у меня { script contents } выделен одним блоком, только потом идет вывод.
это не помогло. Эффект такой же, как у cat script > >(colorify), где colorify - это функция, связанная с sed ....
Ты прав. Я боюсь, что у вашей проблемы нет решения, кроме ожидания или исправления bash, чтобы иметь возможность выбрать, в какой FD записывать вывод -v.
Интересная концепция! Чтобы повысить читабельность (или нет), я использовал "/ bin / bash -v 2>> (grep --color.)".