Сделать bash script print set -вывод x жирным шрифтом, но выводится как обычный текст

#bash #syntax-highlighting

#bash #подсветка синтаксиса

Вопрос:

Я хочу, чтобы каждая команда в my .sh была напечатана жирным шрифтом, но выходные данные, генерируемые командами, не были выделены жирным шрифтом.

(Чтобы я мог четко видеть, что делает скрипт — вывода много).

Testcase:

 > cat foo.sh
#!/bin/bash
set -x
echo foo

> ./foo.sh
  echo foo
foo
  

(Я хочу echo foo выделенный жирным шрифтом и foo обычный, без указания escape-последовательностей вручную, что было бы некрасиво со многими командами).

Я знаю, как выводить жирный текст с помощью echo или printf с помощью управляющих последовательностей терминала; но как я могу повлиять set -x на форматирование вывода?

Комментарии:

1. Что вы искали и что вы нашли? Что вы пробовали и как это не удалось?

2.Прочитайте о PS2 PS3 PS4 переменных в руководстве по bash, а затем соедините их с дубликатом. Тем не менее, я не верю, что можно сбросить флаги обратно, поскольку PS4 они печатаются только в начале.

Ответ №1:

Самым простым было бы проанализировать вывод по мере его поступления.

 $ ./foo.sh 2> >(sed "/  .*/s//$(tput bold)amp;$(tput sr0)/")
  

Вы могли бы установить PS4 значение contain tput bold , но после печати нет команды, которая должна выполняться set -x , поэтому нет способа вернуть поведение к нормальному.

Ответ №2:

В конце я решил применить полужирный шрифт для каждой команды:

 BOLD='33[1m'
RESET='33[0m'

bold() { 
    printf '${BOLD}%s${RESET}n' "$*"
    "$@"
}

bold ls
  

Также { tput bold; printf '%sn' "$*"; tput sgr0; "$@"; } работает.