2017-02-14 5 views
1
biwhite=$(tput bold)$(tput setaf 7) 
color_off=$(tput sgr0) 

printf "%s$USER%s at %s$HOME%s has path %s$PATH%s" "$biwhite" "$color_off" "$biwhite" "$color_off" "$biwhite" "$color_off" 

Есть printf ярлыка, чтобы избежать необходимости определять каждый %s, когда я хочу, чтобы добавить цвета только определенные части заявления?эффективно повторно использовать цветовые коды подстановки а PRINTF% S в Баше

Ввод "$biwhite" "$color_off" 3 раза кажется излишним.

+0

Не так уж и неразумно спросить - многие другие языки имеют возможность ссылаться на определенный позиционный параметр в своих строках формата. –

+0

Как 'zsh'? * утки * – chepner

+1

Вы не должны помещать '$ USER',' $ HOME' и '$ PATH' в строку формата по той же причине, что и вы не можете просто поместить' $ biwhite' и '$ color_off' в format string: если они содержат процентные знаки, у вас есть проблема. – rici

ответ

2

Рекомендуется избегать размещения расширений параметров в строке формата printf, если они содержат знаки процента. Тем не менее, замена параметров предлагает способ устранения некоторой повторяемости.

w="${biwhite}X${color_off}" 

printf "%s at %s has path %s" "${w/X/$USER}" "${w/X/$HOME}" "${w/X/$PATH}" 

Это не является надежным, но это довольно маловероятно, что X появится на выходе tput. Вместо этого вы можете выбрать более длинную строку за счет большего набора текста.

Я боюсь, что добавление цветовых кодов в строку по сути болезненно.

+0

Очень хорошие ответы от всех! Я собираюсь с @chepner, потому что я думаю, что ответ «Я боюсь, что добавление цветовых кодов в строку по сути болезненно». вероятно, самый полезный из них: | – Bleakley

1

Я думаю, вы могли бы написать функцию Баш:

biwhite=$(tput bold)$(tput setaf 7) 
color_off=$(tput sgr0) 

whiten() { 
    echo "$biwhite$1$color_off" 
} 

echo "$(whiten "$USER") at $(whiten "$HOME") has path $(whiten "$PATH")" 

Кроме того, почему использование printf, если вы не используете какой-либо из его возможностей форматирования?

+1

Реальный вопрос, скорее, зачем использовать 'echo' вместо' printf'? –

+2

Кроме того, вы предлагаете OP заменить хороший код на множество подоболочек ... это не очень приятно. –

+1

Использование 'printf' над' echo' напрямую поддерживается [спецификацией POSIX для 'echo'] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html) –

0

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

Примечательно, что в выполнении этого кода не участвуют подоболочки, за исключением вызовов tput, используемых в демонстрационных целях. Это, таким образом, в то время как многословные, очень низкие накладные расходы для выполнения.

biwhite=$(tput bold)$(tput setaf 7) 
color_off=$(tput sgr0) 

# colorize every other argument, starting from the 2nd. 
colorize_words() { 
    local start_color end_color 
    : "${start_color:=$biwhite}" "${end_color:=$color_off}" 
    while (($#)); do 
    printf '%s' "$1" 
    shift || break 
    printf '%s%s%s' "$start_color" "$1" "$end_color" 
    shift || break 
    done 
    printf '\n' 
} 

colorize_words "" "$USER" " at " "$HOME" " has path " "$PATH" 

Это может быть настроена путем пропускания start_color и end_color значения для индивидуального вызова; например:

# this prints every other argument in red 
start_color=$(tput setaf 1) colorize_words "hello " "cruel " world 
+0

Спасибо, Чарльз. У вас всегда есть отличные ответы. – Bleakley