13. Пользовательское окружение
Основной акцент этой книги сделан на системе Linux, которая обычно лежит в основе серверных процессов и интерактивных сеансов пользователя. В конечном итоге система и пользователь должны где-либо встретиться. Файлы запуска системы играют в этом важную роль, поскольку они задают параметры по умолчанию для оболочки и для других интерактивных команд. Они определяют, как поведет себя система при входе пользователя.
Большинство пользователей не уделяют пристального внимания файлам запуска, затрагивая их только тогда, когда необходимо добавить что-либо в целях удобства, например псевдоним. Со временем эти файлы засоряются лишними переменными окружения и проверками, это может привести к раздражающим ошибкам или (довольно серьезным) проблемам.
Если вы уже пользуетесь некоторое время Linux, то могли заметить, что ваш домашний каталог постепенно накапливает невообразимо большое количество файлов запуска. Они иногда называются файлами с точкой, поскольку их имена практически всегда начинаются с точки (.). Многие из них создаются автоматически, когда вы впервые запускаете какую-либо программу, и вам никогда не понадобится менять их. В данной главе рассматриваются главным образом файлы запуска оболочки, которые вам, скорее всего, придется изменять или создавать с нуля. Посмотрим, насколько аккуратно следует работать с такими файлами.
13.1. Рекомендации по созданию файлов запуска
При создании файлов запуска думайте о пользователе. Если вы являетесь единственным пользователем компьютера, вам не о чем излишне беспокоиться, поскольку ошибки будут касаться только вас и они достаточно просты в устранении. Однако, если вы создаете файлы запуска, которые будут применяться по умолчанию для всех новых пользователей компьютера или сети, или же вы рассчитываете на то, что кто-либо скопирует такие файлы для использования на другом компьютере, ваша задача становится существенно сложнее. Если вы сделаете ошибку в файле запуска, предназначенном для десяти пользователей, вам придется исправлять ее десять раз.
При создании файлов запуска для других пользователей придерживайтесь следующих принципов.
• Простота. Старайтесь, чтобы количество файлов запуска было небольшим, сами файлы были бы маленькими, насколько это возможно, простыми для изменения и надежными. Каждый элемент в файле запуска является всего лишь еще одним компонентом, который может выйти из строя.
Читаемость. Создавайте обширные комментарии в файлах, чтобы пользователи получили полное представление о том, что выполняет каждая часть файла.
13.2. Когда изменять файлы запуска
Прежде чем выполнить изменение в файле запуска, задайте себе вопрос, действительно ли это изменение необходимо. Вот несколько веских оснований для изменения файлов запуска.
• Необходимо изменить приглашение по умолчанию.
• Необходимо приспособить какое-либо ПО, установленное локально. Попробуйте, однако, для начала использовать сценарии обертки.
• Существующие файлы запуска неисправны.
Если в вашей системе все работает нормально, будьте осторожны. Иногда файлы запуска, используемые по умолчанию, взаимодействуют с другими файлами из каталога /etc.
И все же вы, вероятно, не стали бы читать эту главу, если вам неинтересно изменять настройки по умолчанию. Давайте разберемся, что же важно.
13.3. Элементы файла запуска оболочки
Что входит в состав файла запуска оболочки? Некоторые элементы могут показаться очевидными, например настройки пути и приглашения. Но что именно должно быть указано в качестве пути и как выглядит приемлемое приглашение? Какое количество элементов будет излишним для размещения в файле запуска?
В нескольких следующих разделах рассмотрены основы файла запуска оболочки — начиная с командного пути, приглашения, псевдонимов и заканчивая маской прав доступа.
13.3.1. Командный путь
Самой важной частью любого файла запуска является командный путь. Этот путь должен охватывать каталоги, которые содержат приложения, представляющие интерес для обычного пользователя. По меньшей мере этот путь должен содержать следующие элементы в указанном порядке:
/usr/local/bin
/usr/bin
/bin
Такой порядок гарантирует, что вы сможете переопределить стандартные команды по умолчанию с помощью локальных вариантов, расположенных в каталоге /usr/local.
В большинстве версий Linux исполняемые файлы практически для всех пакетов ПО помещаются в каталог /usr/bin. Иногда бывают исключения, например при размещении игр в каталоге /usr/games, а графических редакторов — в отдельном каталоге, поэтому сначала проверьте настройки вашей системы по умолчанию. Убедитесь также в том, что каждая из системных команд общего пользования доступна в каком-либо из перечисленных выше каталогов. Если это не так, то ваша система, вероятно, вышла из-под контроля. Не меняйте путь по умолчанию для вашей среды пользователя, чтобы подстроиться под каталог установки нового ПО. Простой способ учесть отдельные каталоги установки — использование символических ссылок в каталоге /usr/local/bin.
Многие пользователи применяют каталог bin для хранения собственных сценариев оболочки и команд, поэтому может потребоваться добавить его в самое начало пути:
$HOME/bin
примечание
По новому соглашению двоичные файлы помещают в каталог $HOME/.local/bin.
Если вам интересны системные утилиты (такие как traceroute, ping и lsmod), добавьте в путь каталоги sbin:
/usr/local/sbin
/usr/sbin
/sbin
Добавление точки (.) в путь
Есть один небольшой, но противоречивый компонент командного пути — точка. Если поместить точку (.) в пути, то это позволит запускать команды в текущем каталоге, не используя символы./ перед именем команды. Это может оказаться удобным при написании сценариев или при компиляции программ, однако такой способ плох по двум причинам.
• Могут появиться проблемы с безопасностью. Никогда не следует помещать точку в начале пути. Вот что при этом может произойти: взломщик может поместить вирус-троян с именем ls в архив, распространяемый через Интернет. Даже если точка окажется в конце пути, вы по-прежнему будете уязвимы для таких опечаток, как sl или ks.
• Это непоследовательно и может привести к путанице. Точка в пути может означать, что поведение команды будет изменяться в соответствии с текущим каталогом.
13.3.2. Путь к страницам руководства
Традиционный путь к страницам руководства определяется с помощью переменной окружения MANPATH, однако не стоит его изменять, поскольку при этом будут перезаписаны системные настройки по умолчанию из файла /etc/manpath.config.
13.3.3. Приглашение
Опытные пользователи избегают длинных, усложненных и бесполезных приглашений. Для сравнения: многие администраторы и версии системы стремятся уместить все в приглашении по умолчанию. Ваш выбор должен отражать потребности пользователей; укажите в приглашении текущий рабочий каталог, имя хоста, а также имя пользователя, если это действительно необходимо.
Кроме того, избегайте использовать символы, которые означают что-либо важное для оболочки, например такие:
{ } = & < >
примечание
Особенно внимательно относитесь к символу >, который может привести к появлению пустых ошибочных файлов в текущем каталоге, если вы случайно скопируете и вставите часть окна оболочки (вспомните о том, что команда > перенаправляет вывод в файл).
Даже приглашение, используемое оболочкой по умолчанию, неидеально. Например, приглашение оболочки bash содержит название оболочки и номер версии.
В следующей простой настройке приглашение для оболочки bash заканчивается символом $ (традиционное приглашение оболочки csh заканчивается символом %):
PS1='\u\$ '
Вместо текущего имени пользователя используется подстановка \u (см. раздел PROMPTING («ПРИГЛАШЕНИЕ» на странице руководства bash(1))). Следующие популярные подстановки содержат:
• \h — имя хоста (в короткой форме, без имени домена);
• \! — номер в истории;
• \w — текущий каталог. Поскольку он может оказаться длинным, можно ограничить отображение только последним компонентом, указав параметр \W;
• \$ — при запуске с учетной записью обычного пользователя применяется $, для корневого пользователя — #.
13.3.4. Псевдонимы
Одной из характерных черт современной среды пользователя являются псевдонимы — это функция оболочки, которая заменяет одну строку другой перед выполнением команды. Псевдонимы могут послужить как сокращения, избавляющие от набора команд. Однако у них есть недостатки:
• передавать аргументы может оказаться затруднительно;
• они приводят к путанице. Встроенная в оболочку команда which может сказать, псевдоним ли перед вами, но она не сообщит вам, где он определен;
• они не одобряются в подоболочках и в неинтерактивных оболочках, а также не работают в других оболочках.
Учитывая эти неудобства, вам следует избегать псевдонимов, где это возможно, поскольку проще написать функцию оболочки или полностью новый сценарий. Современные компьютеры способны запускать и исполнять команды оболочки настолько быстро, что различие между псевдонимом и абсолютно новой командой не будет значимым для вас.
И все же псевдонимы оказываются удобными, когда необходимо изменить часть среды оболочки. Нельзя изменить переменную окружения с помощью сценария оболочки, так как сценарии запускаются в качестве подоболочек. Для выполнения этой задачи можно также определить функции оболочки.
13.3.5. Маска прав доступа
Встроенная в оболочку функция umask (маска прав доступа) устанавливает права доступа по умолчанию. Следует указать запуск команды umask в одном из файлов запуска, чтобы гарантировать то, что каждая выполняемая команда создает файлы с необходимыми вам правами доступа. Два разумных варианта таковы.
• 077. Эта маска является самой сдерживающей маской прав доступа, поскольку она не разрешает никаким другим пользователям доступ к новым файлам и каталогам. Часто это подходит для многопользовательских систем, в которых нежелательно, чтобы другие пользователи видели какие-либо ваши файлы. Тем не менее, если установить ее по умолчанию, это может привести к проблемам, если пользователи желают использовать файлы совместно, но не умеют правильно настраивать права доступа. Неопытные пользователи стремятся назначить файлам режим доступа «доступен для записи всем».
• 022. Эта маска дает другим пользователям право чтения новых файлов и каталогов, что может быть важно в однопользовательской системе, так как многие демоны, которые работают как псевдопользователи, не могут видеть файлы и каталоги, созданные с помощью более строгой маски 077.
примечание
Некоторые приложения (в особенности почтовые программы) переопределяют права доступа, указанные командой umask, изменяя маску на 077, поскольку они считают, что их файлы являются собственностью лишь их владельца и никого более.
13.4. Порядок следования файлов запуска. Примеры
Теперь, когда вы знаете, что поместить в файлы запуска оболочки, самое время посмотреть на некоторые конкретные примеры. Удивительно то, что одним из самых трудных и запутанных моментов при создании файлов запуска является определение того, какой из нескольких файлов запуска использовать. В следующих разделах рассказано о двух самых популярных оболочках Unix: bash и tcsh.
13.4.1. Оболочка bash
В оболочке bash можно выбирать среди файлов запуска. bash_profile, profile, bash_login и. bashrc. Какой из них соответствует командному пути, пути к страницам руководства, приглашению, псевдонимам и маске прав доступа? Ответ такой: файл. bashrc должен сопровождаться символической ссылкой. bash_profile, указывающей на файл. bashrc, поскольку существует несколько различных типов экземпляров оболочки.
Два главных типа экземпляров оболочки — интерактивный и неинтерактивный, но из них только интерактивные оболочки представляют интерес, поскольку неинтерактивные оболочки (например, те, которые запускают сценарии оболочки) обычно не читают никаких файлов запуска. Интерактивными оболочками являются те, которые вы применяете для запуска команд из терминала, вроде тех, что вы видите в этой книге, и они могут быть разделены на оболочки для входа в систему и не для входа в систему.
Оболочки для входа в систему
Традиционно оболочка для входа в систему возникает, когда вы в первый раз входите в систему с помощью терминала, используя такую команду, как /bin/login. Удаленный вход в систему по протоколу SSH также выдает вам оболочку для входа в систему. Основная идея: оболочка для входа в систему является начальной оболочкой. Можно определить, является ли оболочка оболочкой для входа в систему, запустив команду echo $0; если первый символ ответа дефис (-), то эта оболочка является оболочкой для входа в систему.
Когда оболочка bash запущена для входа в систему, она выполняет файл /etc/profile. После этого она ищет пользовательские файлы. bash_profile, bash_login и. profile, запуская только первый файл, который обнаружит.
Как бы странно это ни звучало, но возможно запустить неинтерактивную оболочку в качестве оболочки входа в систему, чтобы принудительно исполнить ее файлы запуска. Для этого запустите такую оболочку с параметром — l или — login.
Оболочки не для входа в систему
Оболочка не для входа в систему — дополнительная оболочка, которую вы запускаете после входа в систему. Это всего лишь любая интерактивная оболочка, которая не является оболочкой входа. Терминальные команды системы управления окнами (xterm, GNOME Terminal и т. д.) запускают оболочки не для входа в систему, если только вы не запросите специально оболочку для входа.
После запуска в качестве оболочки не для входа в систему оболочка bash выполняет файл /etc/bash.bashrc, а затем запускает пользовательский файл. bashrc.
Последствия наличия двух типов оболочек
Причины, по которым существуют два различных типа файлов запуска, заключаются в том, что в давние времена пользователи входили в систему через традиционный терминал с оболочкой для входа в систему, после чего запускали подоболочки не для входа с системами управления окнами или экранной программой. По поводу подоболочек не для входа в систему было решено, что повторяющаяся настройка среды пользователя и запуск набора команд, которые уже запущены, являются расточительством. В оболочках для входа в систему можно было бы запускать замысловатые команды запуска из таких файлов, как. bash_profile, оставив только псевдонимы и другие «легковесные» вещи файлу. bashrc.
В наши дни большинство пользователей входит в систему через графические менеджеры дисплея (из следующей главы вы узнаете об этом подробнее). Многие из них начинают работу с одной неинтерактивной оболочки для входа в систему, чтобы сохранить описанную выше модель «для входа — не для входа». Если они этого не делают, вам придется полностью настроить окружение (путь, путь к страницам руководства и т. п.) в файле. bashrc, а иначе вы не увидите ничего из вашего окружения в терминальном окне оболочек. Кроме того, вам потребуется также файл. bash_profile, если вы желаете войти в консоль или удаленно, поскольку такие оболочки для входа даже не беспокоятся о файле. bashrc.
Пример файла. bashrc
Чтобы удовлетворить оба типа оболочек, каким образом создавать файл. bashrc, который можно было бы использовать и в качестве файла. bash_profile? Приведу один весьма элементарный (и в то же время совершенно достаточный) пример:
# Command path.
PATH=/usr/local/bin:/usr/bin:/bin:/usr/games
PATH=$HOME/bin:$PATH
# PS1 is the regular prompt.
# Substitutions include:
# \u username \h hostname \w current directory
# \! history number \s shell name \$ $ if regular user
PS1='\u\$ '
# EDITOR and VISUAL determine the editor that programs such as less
# and mail clients invoke when asked to edit a file.
EDITOR=vi
VISUAL=vi
# PAGER is the default text file viewer for programs such as man.
PAGER=less
# These are some handy options for less.
# A different style is LESS=FRX
# (F=quit at end, R=show raw characters, X=don't use alt screen)
LESS=meiX
# You must export environment variables.
export PATH EDITOR VISUAL PAGER LESS
# By default, give other users read-only access to most new files.
umask 022
Как описано ранее, можно использовать такой файл. bashrc в качестве файла. bash_profile с помощью символической ссылки. Можно также сделать эту связь еще четче, создав файл. bash_profile, как в этой однострочной команде:
. $HOME/.bashrc
Проверка того, является ли оболочка интерактивной
Если файл. bashrc соответствует файлу. bash_profile, то обычно не приходится запускать дополнительные команды для оболочек входа в систему. Однако, если вы желаете назначить различные действия для разных типов оболочек, можно добавить следующую проверку в файл. bashrc, которая отслеживает наличие символа i в переменной оболочки $-:
case $- in
*i*) # interactive commands go here
command
—snip—
;;
*) # non-interactive commands go here
command
—snip-
;;
esac
13.4.2. Оболочка tcsh
Стандартным вариантом оболочки csh практически во всех системах Linux является оболочка tsch, улучшенная C-оболочка, которая сделала популярными такие функции, как редактирование командной строки и многорежимное завершение имен файлов и команд. Даже если вы не используете оболочку tsch как оболочку по умолчанию для нового пользователя (мы рекомендуем применять оболочку bash), наличие файлов запуска для нее все же необходимо на тот случай, если пользователь натолкнется на нее.
В оболочке tsch вам не надо беспокоиться о различиях между оболочками для входа/не для входа в систему. Во время запуска оболочка tsch ищет файл. tcshrc. Если это не удается, она ищет файл запуска. cshrc оболочки csh. Причина такого порядка действий в том, что файл. tcshrc можно использовать для таких расширений оболочки tcsh, которые не работают в оболочке csh. Вам, возможно, стоит придерживаться обычного файла. cshrc вместо. tcshrc; весьма маловероятно, что кому-либо понадобится применить ваши файлы запуска для оболочки csh. Если какой-либо пользователь действительно встретит оболочку csh в другой системе, ваш файл. cshrc будет работать.
Пример файла. cshrc
Приведу пример файла. cshrc:
# Command path.
setenv PATH /usr/local/bin:/usr/bin:/bin:$HOME/bin
# EDITOR and VISUAL determine the editor that programs such as less
# and mail clients invoke when asked to edit a file.
setenv EDITOR vi
setenv VISUAL vi
# PAGER is the default text file viewer for programs such as man.
setenv PAGER less
# These are some handy options for less.
setenv LESS meiX
# By default, give other users read-only access to most new files.
umask 022
# Customize the prompt.
# Substitutions include:
# %n username %m hostname %/ current directory
# %h history number %l current terminal %% %
set prompt="%m%% "
13.5. Пользовательские настройки по умолчанию
Лучший способ написать файлы запуска и выбрать параметры по умолчанию для новых пользователей — поэкспериментировать в системе с новым «тестовым» пользователем. Создайте такого пользователя с пустым домашним каталогом и воздержитесь от копирования ваших файлов запуска в каталог этого пользователя. Напишите новые файлы запуска с нуля.
Когда вы решите, что рабочие настройки готовы, зайдите в систему как новый тестовый пользователь всеми возможными способами (через консоль, удаленно и т. д.). Убедитесь в том, что вы проверили все, что только можно, включая систему управления окнами и страницы руководства. Когда вас устроят параметры тестового пользователя, создайте второго тестового пользователя, скопировав файлы запуска от первого. Если все работает так же хорошо, то у вас теперь есть набор файлов запуска, который можно предоставлять новым пользователям.
В следующих разделах приведены разумные параметры по умолчанию для новых пользователей.
13.5.1. Параметры по умолчанию для оболочки
Оболочкой по умолчанию для всех новых пользователей системы Linux следует сделать bash, так как:
• пользователи будут взаимодействовать с той же оболочкой, в какой они привыкли создавать сценарии (к примеру, оболочка csh является весьма плохим инструментом для создания сценариев — даже и не думайте о ней);
• оболочка bash является стандартом в системах Linux;
• оболочка bash использует библиотеку GNU readline, и, следовательно, ее интерфейс идентичен интерфейсу многих других инструментов;
• оболочка bash обеспечивает вас прекрасным и понятным контролем над перенаправлением ввода/вывода и работой с файлами.
Тем не менее многие опытные кудесники Unix пользуются такими оболочками, как csh и tcsh, только потому, что они не любят менять привычки. Конечно же, вы можете выбрать любую оболочку по своему вкусу, но, если у вас нет никаких предпочтений, выбирайте bash, а также применяйте ее как оболочку по умолчанию для любого нового пользователя системы. Пользователь может изменить оболочку с помощью команды chsh, чтобы она соответствовала его индивидуальным вкусам.
примечание
Есть множество других оболочек (rc, ksh, zsh, es и т. п.). Некоторые из них не подходят в качестве оболочки для новичка, однако иногда новые пользователи, которые ищут альтернативные оболочки, применяют оболочки zsh и fish.
13.5.2. Редактор
В традиционной системе редактором по умолчанию является vi или emacs. Это единственные редакторы, наличие которых практически гарантировано для любой системы Unix, это значит, что они доставят меньше всего неудобств для нового пользователя в процессе работы. Однако часто в системах Linux в качестве редактора по умолчанию настраивается nano, поскольку для начинающих он проще в применении.
Что касается файлов запуска оболочки, избегайте больших файлов запуска для редактора по умолчанию. Небольшая команда set showmatch в файле запуска. exrc еще никому не повредила: она избавляет редактор от всего, что существенно меняет его поведение или внешний вид (например, функция showmode, автоматическая расстановка отступов и перенос текста на следующую строку).
13.5.3. Переменная PAGER
Абсолютно разумно указать для переменной окружения PAGER значение по умолчанию less.
13.6. Подводные камни в файлах запуска
Придерживайтесь следующих правил в файлах запуска.
• Не помещайте никаких графических команд в файл запуска оболочки.
• Не определяйте переменную окружения DISPLAY в файле запуска оболочки.
• Не определяйте тип терминала в файле запуска оболочки.
• Не скупитесь на подробные комментарии в файлах запуска по умолчанию.
• Не запускайте в файле запуска команды, которые выполняют печать в стандартный вывод.
• Никогда не определяйте переменную LD_LIBRARY_PATH в файле запуска оболочки (см. подраздел 15.1.4).
13.7. Дальнейшие вопросы, связанные с запуском
Поскольку в этой книге рассматриваются только уровни, лежащие в основе Linux, я не буду рассказывать о файлах запуска оконной среды. Это действительно объемная тема, поскольку менеджер дисплея, который выполняет ваш вход в современной системе Linux, обладает собственным набором файлов запуска, таких как. xsession, xinitrc, а также бесконечным набором комбинаций из элементов, относящихся к средам GNOME и KDE.
Варианты работы с окнами могут показаться сбивающими с толку, поскольку не существует общего способа запустить оконную среду в Linux. В следующей главе описаны некоторые из множества возможностей. Тем не менее, когда вы определяете, что должна делать ваша система, вас могут немного увести в сторону файлы, относящиеся к графическому окружению. Это нормально, но не взваливайте эту работу на новых пользователей. Принцип, согласно которому файлы запуска оболочки следует делать как можно проще, творит также чудеса и для файлов запуска графического интерфейса пользователя. На самом деле вам, наверное, вовсе не требуется изменять эти файлы запуска.