1. Подсвечиваем приглашение командной строки
Зачастую после последовательного запуска команд, выводящих большие объемы текста, при прокручивании окна терминала довольно трудно найти приглашение командной строки, которое в некотором роде является разделителем между вызовами команд, и вывод нескольких команд превращается в один сплошной блок текста. С данной проблемой я борюсь следующим образом:
В ~/.bashrc у меня прописана следующая строка:
PS1='\[\033[01m\]\w\$\[\033[00m\] 'которая заставляет bash выводить приглашение командной строки жирным шрифтом.
На данном скриншоте приведен пример того, как выглядит консоль без подсветки приглашения командной строки (слева) и с подсветкой (справа):
Текст можно делать жирным, подчеркнутым, курсивом, менять его цвет и цвет фона. Приводить примеры того, как это сделать, я не буду, т. к. вам не составит труда найти всю необходимую информацию в интернете (ключевые слова: xterm escape sequences).
2. Подсвечиваем вывод программ
Если вы, например, компилируете какое-либо приложение, то предупреждения, выдаваемые компилятором "тонут" в общем потоке выводимой информации. И хотя эту проблему можно решить при помощи colorgcc (Несколько небольших советов), то с выводом других программ мы ничего сделать не сможем, разве что перенаправить stdin и stdout в разные файлы, что довольно неудобно.
Для решения этой задачи я написал небольшой скрипт. Работает он следующим образом:
Если имя скрипта имеет вид *colorize_errors.sh, то вызов
colorize_errors.sh mplayer video_file.aviзапустит 'mplayer video_file.avi' и подсветит все, что выведет mplayer в стандартный поток ошибок.
Если имя скрипта имеет вид *colorize_output.sh, то вызов
colorize_output.sh mplayer video_file.aviзапустит 'mplayer video_file.avi' и подсветит весь его вывод (может пригодиться при написании скриптов).
Сразу хочу предупредить, что скрипт не лишен недостатков: при подсветке может появиться рассинхронизация потоков вывода, если программа выводит данные довольно часто. Происходит это потому, что подсвеченный текст выводится с небольшим запозданием. Но для большинства задач данный недостаток не очень существенен (по крайней мере мне он не сильно мешает :) ).
Ниже приведен пример работы этого скрипта:
Вообщем, как всегда буду рад, если кому-нибудь пригодится. :)
colorize_errors.sh:
#!/bin/bash #*************************************************************************** #* Copyright (C) 2008, Konishchev Dmitry * #* http://konishchevdmitry.blogspot.com/ * #* * #* This program is free software; you can redistribute it and/or modify * #* it under the terms of the GNU General Public License as published by * #* the Free Software Foundation; either version 3 of the License, or * #* (at your option) any later version. * #* * #* This program is distributed in the hope that it will be useful, * #* but WITHOUT ANY WARRANTY; without even the implied warranty of * #* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * #* GNU General Public License for more details. * #**************************************************************************/ # Скрипт подсвечивает вывод программы, переданной ему в качестве аргумента. # Если запущен как colorize_errors.sh, то подсвечивает только stderr. # Если запущен как colorize_output.sh, то подсвечивает stdout и stderr. # # Пример вызова: # colorize_errors.sh mplayer video.avi # "Теги" окрашивания текста --> color_start=`echo -e "\033[1;31m"` color_end=`echo -e "\033[00m"` # "Теги" окрашивания текста <-- die() { echo "${color_start}Error! $@$color_end" >&2 exit 1 } script_command="$0" # Определяем по имени скрипта, что именно надо подсвечивать --> if echo "$script_command" | grep "colorize_output.sh$" > /dev/null then colorize_mode="output" elif echo "$script_command" | grep "colorize_errors.sh$" > /dev/null then colorize_mode="errors" else die "Colorize output: bad colorize output script name." fi # Определяем по имени скрипта, что именно надо подсвечивать <-- # Определяем режим, в котором будет работать скрипт --> if [ "$1" == '--invert' ] then mode='invert' shift elif [ "$1" == '--colorize' ] then mode='colorize' shift else mode='normal' fi # Определяем режим, в котором будет работать скрипт <-- # Проверяем, передал ли пользователь команду --> if [ "$mode" == 'normal' -o "$mode" == 'invert' ] then if [ "$1" == "" ] then die "Colorize $colorize_mode: command not setted." fi fi # Проверяем, передал ли пользователь команду <-- # Обычный режим, когда пользователь запускает скрипт if [ "$mode" == 'normal' ] then # Запускаем этот же скрипт и меняем местами потоки вывода, # т. к. при окрашивании stdout становится stderr и наоборот if [ "$colorize_mode" == 'output' ] then $script_command --invert "$@" 3<&1 1<&2 2<&3 | $script_command --colorize else $script_command --invert "$@" 3<&1 1<&2 2<&3 fi # Режим, в задачу которого входит запуск команды с перенаправлением # ее выводов в скрипт окрашивания elif [ "$mode" == 'invert' ] then "$@" 3<&1 1<&2 2<&3 | $script_command --colorize # Режим подсветки данных, поступающих в stdin elif [ "$mode" == 'colorize' ] then while read line do echo "$color_start$line$color_end" done # Ошибка else die 'Logical error!' fi
5 комментариев:
а можно както сделать чтобы увсех программ stderr подсвечивался?
так чтобы не вызывать каждую прогу со скриптом
Честно говоря, не знаю. И мне кажется, что без правки исходных кодов bash такое вряд ли удастся сделать.
можно.. все можно Ж:-)
вот тут http://rusmafia.org/linux/taxonomy/term/92
целый набор советов по подстведке текста в консоли
каюсь невнемательно прочитал вопрос.
такое сделать поидее можно. так на вскидку
1. делаем mkfifo пайп для ошибок текущего шела
mkfifo /tmp/stderr-$$
2. перенаправляем поток ошибок текущего шела в этот пайп
exec 2>tmp/stderr-$$
3. запускаем в фоне процесс который читает из пайпа, подсвечивает строчки и выводит обратно на терминал
sed -ue 's/.*/ESC-цевета & ESC-отмены-цвета /' /tmp/stderr-$$ &
все..
писано на коленке только что, надо проверить Ж:-)
из недостатков - будет асинхронный вывод ошибок и стандартного вывода
Да, про exec я как-то и забыл... Спасибо, оставлю себе на заметку. Вполне можно вставить эти строчки в ~/.bashrc. Хотя по мне все-таки лучше уж вручную запускать для каждой команды, если для нее рассинхронизация не влияет роли.
Отправить комментарий