Настроенный по дефолту терминал — унылое зрелище, отпугивающее новичков и наводящее тоску на гуру. Многое из того, что способен дать командный интерпретатор пользователю, оказывается скрыто за семью замками, а то, что остается доступным — просто неудобно. Перед тем, как консоль станет действительно сподручным инструментом, придется изрядно попотеть.
Полезная инфа в приглашении
Приглашение командного интерпретатора bash формируется на основе содержимого переменной окружения PS1. Если верить man-страницам, эта переменная может содержать любые строки, а также довольно большой набор специальных управляющих символов, которые при выводе приглашения будут превращены в актуальные данные. Так, например, в дистрибутиве Ubuntu содержимое переменной PS1 выглядит так:
'${debian_chroot:+($debian_chroot)}u@h:w$ '
А при выводе на экран превращается во всем знакомую строку вида:
юзер@имя_хоста:текущий_каталог$
Нетрудно догадаться, что юзер здесь появляется за счет управляющего символа ‘u’, имя хоста — за счет ‘h’, а текущий каталог — это ‘w’. Неуклюжая запись, содержащая в себе слова debian_chroot, это всего лишь индикатор того, находится ли пользователь в chroot-окружении. Такое лаконичное приглашение, конечно, удобно, но содержит далеко не всю информацию, которую bash способен отобразить. В его арсенале есть как минимум два десятка различных управляющих последовательностей, о которых многие пользователи даже не подозревают. Вот список наиболее интересных из них:
- d — текущая дата
- j — количество фоновых заданий
- A — текущее время
- ! — номер команды в истории
Кроме того, в PS1 вполне можно использовать текущие переменные окружения, а если учитывать, что перед каждым выводом на экран PS1 перечитывается, то туда можно засунуть такие вкусности, как, например, статус последней выполненной команды (переменная $?), чтобы знать, было ли ее исполнение успешным.
Управляющий символ ‘n’ также допустим в PS1, поэтому приглашение к вводу можно сделать многострочным, а заодно визуально отделить его от остального текста (с помощью начальной пустой строки):
PS1='nwnu@h:$?$ '
Но и это еще не все. Пример с индикатором chrootокружения показывает, что в приглашении можно использовать вывод любых сторонних приложений, а это открывает просто безграничные возможности по его кастомизации. Например, следующим образом в приглашение можно добавить данные о текущей погоде, количестве непрочитанных писем в gmail и уровне сигнала Wi-Fi:
$ vi ~/.bashrc
Google-погода
|
1 2 3 4 5 6 7 |
weather() { local city="Moscow" # Где мы? curl -s "http://www.google.com/ig/ api?weather=$city" | sed 's|.<em><temp_c data=" ([^"]</em>)"/>.*|1|' } |
Google-почта
|
1 2 3 4 5 6 7 8 |
unread_mail(){ local login="логин" # Имя пользователя и пароль (без @gmail.com) local password="пароль" wget --secure-protocol=TLSv1 --timeout=3 -t 1 -q -O — https://${login}:${password}@ mail.google.com/mail/feed/atom --nocheckcertificate | grep fullcount | sed "s/<fullcount>(.*)</fullcount>/1/" } |
Сигнал Wi-Fi
|
1 2 3 4 5 |
wifi(){ /sbin/iwconfig wlan0 | grep Quality | cut -d = -f2 | awk '{print $1}' } PS1='nweather:unread_mail:wifi:wn u@h:$?$ ' |
Все это нужно поместить в конец ~/.bashrc и выставить на файл права 600, чтобы никто не смог подсмотреть пароли. Результат будет примерно таким:
-7:32:70/70:/usr/local
j1m@1313:0$
Печать даты в правом верхнем углу
Давайте соберем их все вместе и создадим командную строку, которая выводит дату в правом верхнем углу терминала:
|
1 |
PS1="\$(tput sc)\[\033[1;\$(echo -n \$((\$COLUMNS-15)))H\]\d\$(tput rc)$ " |

В приведенном выше выражении происходит многое. Сначала мы сохраняем текущее положение курсора с помощью команды tput sc. Обратите внимание, что команда tput sc вложена в оператор подстановки команд $(…). Во-вторых, мы перемещаем курсор в правое верхнее положение нашего терминала.
Поэтому мы устанавливаем номер строки курсора равным 1 и создаем выражение для вычисления номера столбца. В этом выражении мы получаем номер последнего столбца нашего терминала из переменной окружения $COLUMNS и вычитаем 15, чтобы создать пространство, необходимое для печати даты.
После установки положения курсора в правом верхнем углу мы печатаем текущую дату с помощью \ d управляющего символа. Однако мы по-прежнему ничего не напечатали в тексте командной строки. Для этого мы сначала восстанавливаем положение курсора в исходное положение с помощью команды tput rc и печатаем знак доллара.
Раскрашиваем консоль
При работе в консоли пользователь часто получает большое количество никак не отформатированной информации. Порой выбрать в потоке данных действительно необходимое довольно сложно. Благодаря специальным непечатаемым escape-последовательностям мы можем изменить цвет и фон выводимых символов, чтобы облегчить восприятие данных.
Все escape-последовательности заключаются в [33[ и ], а после кода цвета должна еще стоять буква m. Все цвета расписаны в справочной странице. Например, черному соответствует 0;30, зеленому — 0;32, красному — 0;31, желтому — 1;33, белому — 1;37 и так далее. Чтобы в строке приглашения выводились имя системы (символ h) и логин пользователя (u), подсвеченные красным цветом, а текущий каталог — желтым (w), в конфиге ~/.bashrc заменяем значение переменной PS1 на следующее:
|
1 |
PS1="[33[0;31m]u@h:[33[1;33m](w)[33[0m][33[0m]" |
При необходимости через точку с запятой можно указать цвет фона. Для этой цели используются числа от 40 (черный) до 47 (белый).
|
1 |
PS1="[33[32;40mw[33[0m]>" |
Все это также можно использовать в скриптах, хотя, чтобы не путаться, в этом случае лучше задействовать переменные, которые потом и вызывать в нужном месте. Например:
|
1 2 |
local GRAY="[33[1;30m]" local NO_COLOUR="[33[0m]" |
Не забываем о том, что некоторые команды поддерживают цветной вывод. Проще это решить при помощи алиасов:
|
1 2 |
alias ls='ls --color=auto' alias grep='grep --color=auto' |
И так далее. За настройки цветов каталогов и файлов с разным расширением отвечает утилита dircolors, устанавливающая переменную LC_COLORS. Чтобы получить все значения, просто вводим:
|
1 |
$ dircolors --print-database |
Использовав полученный результат как шаблон и сохранив его в / etc/DIR_COLORS (либо в персональном конфиге ~/.dir_colors), можно создать свою раскраску.
Программистам будет очень полезен cout (code.google.com/p/cout) — небольшой скрипт на Python, подсвечивающий вывод make, gcc, svn и diff. Скрипт не требует установки, просто скачиваем и распаковываем архив, а затем создаем псевдоним:
|
1 |
$ alias makec='cout data/make-gcc.cfg' |
Теперь проверяем работоспособность, используя заранее подготовленный Makefile:
|
1 |
$ makec -f Makefile |
Шелл (консоль) — это оболочка, в которой выполняются команды. Он показывает вам так называемое приглашение, оно обычно состоит из имени пользователя, имени компьютера и пути к тому месту, где вы сейчас находитесь. И выполняет команды, которые вы в него вводите.

Скучновато, правда? Первое, что мы сделаем — сменим оболочку с bash на zsh. Bash — это стандартная оболочка, которая поставляется в комплекте большинства систем. Zsh — это более современная оболочка со множеством плюшек. По сравнению с bash улучшены автодополнение, алиасы, хоткеи. Всё, что может bash, zsh может тоже, так что не вижу причин не переходить. У пользователей OS X zsh уже есть на компьютере, а пользователям Linux, скорее всего, нужно его установить. В Ubuntu и Debian это делается просто:
|
1 |
sudo apt install zsh |