Научившись (главным образом в результате чтения документации и непрестанных экспериментов) создавать работающие сценарии, Мефодий решил приступить к настройке командной оболочки, поскольку, как он слышал, для этого используются именно сценарии.
Привязка к клавишам
Оказалось, что настройка управляющих клавиш в bash
не выглядит как сценарий, и даже имеет отношение не только к bash
, а ко всем программам, использующим библиотеку терминального ввода readline
. Конфирурационный файлreadline
называется .inputrc
и состоит, в основном, из команд вида "управляющая_последовательность": функция
, где управляющая_последовательность
— это символы, при получении которых readline
выполнит функцию
работы с вводимой строкой. Список всех функций readline
можно узнать у bash
по команде bind -l
, а список всех привязок этих функций к клавиатурным последовательностям — по команде bind -p
. Мефодий вписал в .inputrc
такие две строки:
"\e[5~": backward-word
"\e[6~": forward-word
Пример 19. Настройка .inputrc
Упомянутые в примере функции позволяют перемещать курсор в командной строке по словам, а ESC-последовательности возвращаются, соответственно, клавишами Page Up
и Page Down
виртуальной консоли Linux (сочетание «e
» означает в .inputrc
клавишу ESC, то есть «^[
», символ с ASCII-кодом 27
).
К одной и той же функции readline
можно привязать сколько угодно управляющих последовательностей: например, клавиша &home&
делает то же, что и «^A
», Стрелка вверх
— то же, что и «^P
», а Del
— то же, что и «^D
» (только не в пустой строке!). Этим отчасти решается проблема несовместимости управляющих последовательностей терминалов: если в каком-нибудь терминале другого типа Page Up
или Page Down
будут возвращать другие последовательности, Мефодий просто добавит в .inputrc
ещё одну пару команд. Правда, Гуревич советовал вовсе отказаться от редактирования .inputrc
, а воспользоваться утилитой tput
, которая обращается к переменной TERM
и базе данных по терминалам terminfo
и готова выдать верную для любого данного терминала информацию по kpp
(key previous page) и knp
(key next page). Выдачу tput
можно «скормить» той же bind
, и получить команду, которая работает на любом терминале: bind ""`tput kpp`": backward-word"
(кавычки, экранированные обратной косой чертой, "
, передадутся bind
в неизменном виде).
Стартовые сценарии
Настройка оболочки — это в первую очередь настройка окружения. В начале сеанса работы (при запуске стартового командного интерпретатора) выполняется с помощью команды «.
» сценарий из файла со специальным именем — /etc/profile
. Это — т. н. общесистемный профиль, стартовый сценарий, выполняющийся при входе в систему любого, кто использует командную оболочку, подобную sh
. Следом выполняется персональный профиль (или просто профиль) пользователя, сценарий, находящийся в домашнем каталоге, и называющийся .profile
. Этот сценарий пользователь может видоизменять, как ему заблагорассудится.
Что касается bash
, то структура его стартовых файлов сложнее. Прежде всего, ~/.profile
выполняется только если в домашнем каталоге нет файла .bash_profile
или .bash_login
, иначе стартовый сценарий берётся оттуда. В эти файлы можно помещать команды, несовместимые с другими версиями shell, например, управление сокращениями или привязку функций к клавишам. Кроме того, каждый интерактивный (взаимодействующий с пользователем), но не стартовый bash
выполняет системный и персональный конфигурационные сценарии /etc/bashrc
и ~/.bashrc
. Чтобы стартовый bash
также выполнял ~/.bashrc
, соответствующую команду необходимо вписать в ~/.bash_profile
. Далее, каждый неинтерактивный (запущенный для выполнения сценария) bash
сверяется с переменной окружения BASH_ENV
и, если в этой переменной записано имя существующего файла, выполняет команды оттуда. Наконец, при завершении стартового bash
выполняются команды из файла ~/.bash_logout
.
Пример настроек
Ниже приведены примеры конфигурационных файлов, которые Мефодий, сам или с помощью Гуревича, разместил в домашнем каталоге.
PS1="\u@\h:\w \$ "
EDITOR="/usr/bin/vim"
export PS1 EDITOR
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
Пример 20. Пример файла .bash_profile
В этом файле вызывается ~/.bashrc
(если он существует).
# User specific aliases and functions
if [ -r ~/.alias ]; then
. ~/.alias
fi
# Source global definitions
if [ -r /etc/bashrc ]; then
. /etc/bashrc
fi
Пример 21. Пример файла .bashrc
Мефодий решил, что сокращения удобнее будет хранить в отдельном файле — ~/.alias
. Кроме того, вызывается сценарий bashrc
, который Мефодий обнаружил в каталоге /etc
. Этот файл не входит в число автоматически выполняемых bash
, поэтому его выполнение надо задавать явно.
alias > ~/.alias
Пример 22. Пример файла .bash_logout
Заметив, что команда alias
выдаёт список сокращений в том же формате, в котором они и задаются, Мефодий придумал, как обойтись без редактирования файла ~/.alias
. Отныне все сокращения, определённые к моменту завершения сеанса работы, будут записываться обратно в .alias
. Туда попадут и те сокращения, что прочлись во время выполнения .bashrc
, и те, что впоследствии были определены вручную.
alias l='ls -FAC'
alias ls='ls --color=auto'
alias pd='pushd'
alias pp='popd'
alias v='ls -ali'
alias vi='/usr/bin/vim'
Пример 23. Пример файла .alias
Последняя запись в файле .alias
относится к инструменту, которым Мефодий создавал все эти файлы: текстовому редактору vim
. О текстовых редакторах речь пойдёт в следующей лекции.