Bash: как выделить выполненные команды?

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 - программный диалог с интерактивными программами.

Интересная концепция! Чтобы повысить читабельность (или нет), я использовал "/ bin / bash -v 2>> (grep --color.)".

Mark 07.10.2018 20:54

это выделит все, что было передано в stderr. Как и мое текущее простое уродливое решение :(

kyb 07.10.2018 22:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
303
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено:

То, о чем вы просите, невозможно:

  1. Без исправления bash невозможно отделить вывод -v bash от stderr вашей программы.
  2. Даже если бы это было возможно, разделенные выходные данные не могут быть легко повторно синхронизированы, поэтому вы не сможете раскрасить каждую строку, за которой непосредственно следует ее вывод.

Единственный способ легко получить желаемое - это

  1. Адаптируйте свой скрипт так, чтобы каждая строка могла быть получена индивидуально (это допустимая командная строка bash)
  2. Создайте сценарий-оболочку, который читает ваш сценарий построчно и удаляет его после печати раскрашенным.

В моем исходном ответе (приведенном ниже) используется обходной путь, который делает то, что вы хотите, но с оговоркой о группировке всего раскрашенного вывода в один блок (и вы хотите, чтобы каждая строка была раскрашена по мере ее выполнения).

ОРИГИНАЛ:

Поскольку в настоящее время нет способа указать bash использовать другой дескриптор для вывода -v, поэтому вы не можете отделить его от stderr вашего скрипта.

Если вы хотите выделить только вывод -v (а не stderr), единственный способ добиться этого - настроить сценарий для разделения потоков вручную:

  1. Добавьте exec 2>&3 в качестве первой инструкции в вашем скрипте,
  2. Оберните остальную часть кода в блок { ... ; } 2>&4
  3. Позвоните в 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, если ваш скрипт должен их использовать.

Спасибо за ответ. Bash читает содержимое в скобках как одну команду. Итак, у меня { script contents } выделен одним блоком, только потом идет вывод.

kyb 07.10.2018 18:14

это не помогло. Эффект такой же, как у cat script > >(colorify), где colorify - это функция, связанная с sed ....

kyb 07.10.2018 22:13

Ты прав. Я боюсь, что у вашей проблемы нет решения, кроме ожидания или исправления bash, чтобы иметь возможность выбрать, в какой FD записывать вывод -v.

Camusensei 08.10.2018 19:11

Другие вопросы по теме