Искусство программирования на языке сценариев командной оболочки
Шрифт:
Простая escape-последовательность, которая управляет атрибутом подчеркивания (в rxvt и aterm).
bash$ echo -e "\033[4mЭто подчеркнутый текст.\033[0m"
Другие escape-последовательности, изменяющие атрибуты цвета:
bash$ echo -e '\E[34;47mЭтот текст
bash$ echo -e '\E[33;44m'"желтый текст на синем фоне"; tput sgr0
Команда tput sgr0 возвращает настройки терминала в первоначальное состояние.
Вывод цветного текста осуществляется по следующему шаблону:.
echo -e '\E[COLOR1;COLOR2mКакой либо текст.'
Где "\E[" -- начало escape-последовательности. Числа "COLOR1" и "COLOR2", разделенные точкой с запятой, задают цвет символов и цвет фона, в соответствии с таблицей цветов, приведенной ниже. (Порядок указания цвета текста и фона не имеет значения, поскольку диапазоны числовых значений цвета для текста и фона не пересекаются). Символ "m" -- должен завершать escape-последовательность.
Обратите внимание: одиночные кавычки окружают все, что следует за echo -e.
Числовые значения цвета, приведенные ниже, справедливы для rxvt. Для других эмуляторов они могут несколько отличаться.
Таблица 33-1. Числовые значения цвета в escape-последовательностях
Цвет | Текст | Фон |
---|---|---|
черный | 30 | 40 |
красный | 31 | 41 |
зеленый | 32 | 42 |
желтый | 33 | 43 |
синий | 34 | 44 |
пурпурный | 35 | 45 |
зеленовато-голубой | 36 | 46 |
белый | 37 | 47 |
Пример 33-9. Вывод цветного текста
#!/bin/bash
# color-echo.sh: Вывод цветных сообщений.
black='\E[30;47m'
red='\E[31;47m'
green='\E[32;47m'
yellow='\E[33;47m'
blue='\E[34;47m'
magenta='\E[35;47m'
cyan='\E[36;47m'
white='\E[37;47m'
cecho # Color-echo.
# Аргумент $1 = текст сообщения
# Аргумент $2 = цвет
{
local default_msg="Нет сообщений."
# Не обязательно должна быть локальной.
message=${1:-$default_msg} # Текст сообщения по-умолчанию.
color=${2:-$black} # Цвет по-умолчанию черный.
echo -e "$color"
echo "$message"
tput sgr0 # Восстановление первоначальных настроек терминала.
return
}
# Попробум что-нибудь вывести.
# ----------------------------------------------------
cecho "Синий
cecho "Пурпурный текст." $magenta
cecho "Позеленевший от зависти." $green
cecho "Похоже на красный?" $red
cecho "Циан, более известный как цвет морской волны." $cyan
cecho "Цвет не задан (по-умолчанию черный)."
# Аргумент $color отсутствует.
cecho "\"Пустой\" цвет (по-умолчанию черный)." ""
# Передан "пустой" аргумент цвета.
cecho
# Ни сообщение ни цвет не переданы.
cecho "" ""
# Функции переданы "пустые" аргументы $message и $color.
# ----------------------------------------------------
echo
exit 0
# Упражнения:
# ---------
# 1) Добавьте в функцию 'cecho ' возможность вывода "жирного текста".
# 2) Добавьте возможность управления цветом фона.
Moshe Jacobson разработал утилиту color , которая значительно упрощает работу с ANSI escape-последовательностями, заменяя, только что обсуждавшиеся, неуклюжие конструкции, логичным и понятным синтаксисом.
33.6. Оптимизация
По большей части, сценарии на языке командной оболочки, используются для быстрого решения несложных задач. Поэтому оптимизация сценариев, по скорости исполнения, не является насущной проблемой. Тем не менее, представьте себе ситуацию, когда сценарий, выполняющий довольно важную работу, в принципе справляется со своей задачей, но делает это очень медленно. Написание же аналогичной программы на языке компилирующего типа -- неприемлемо. Самое простое решение -- переписать самые медленные участки кода сценария. Возможно ли применить принципы оптимизации к сценарию на практике?
Для начала проверьте все циклы в сценарии. Основная масса времени уходит на работу в циклах. Если это возможно, вынесите все ресурсоемкие операции за пределы циклов.
Старайтесь использовать встроенные команды. Они исполняются значительно быстрее и, как правило, не запускают подоболочку при вызове.
Избегайте использования избыточных команд, особенно это относится к конвейерам.
cat "$file" | grep "$word"
grep "$word" "$file"
# Эти команды дают один и тот же результат,
#+ но вторая работает быстрее, поскольку запускает на один подпроцесс меньше.
Не следует злоупотреблять командой cat.
Для профилирования сценариев, можно воспользоваться командами time и times. Не следует пренебрегать возможностью переписать особенно критичные участки кода на языке C или даже на ассемблере.
Попробуйте минимизировать количество операций с файлами. Bash не "страдает" излишней эффективностью при работе с файлами, попробуйте применить специализированные средства для работы с файлами в сценариях, такие как awk или Perl.