В течение многих лет оболочка Bash была неотъемлемой частью многих дистрибутивов Linux. Вначале Bash был выбран в качестве официальной оболочки GNU, потому что он был хорошо известен, достаточно стабилен и предлагал приличный набор функций.
Сегодня ситуация несколько иная – Bash по-прежнему присутствует повсюду как программный пакет, но его заменили альтернативы в стандартной установке. К ним относятся, например, оболочка Debian Almquist (Dash) (для Debian GNU/Linux) или Zsh (для GRML). В хорошо известных дистрибутивах Ubuntu, Fedora, Arch Linux и Linux Mint Bash до сих пор оставался стандартной оболочкой.
Очень полезно понимать запуск Bash и знать, как его правильно настроить. Это включает настройку среды оболочки, например, установку переменной $PATH, настройку внешнего вида приглашения оболочки и создание псевдонимов. Также мы рассмотрим два файла .bashrc и .bash_profile, которые читаются при запуске. Соответствующие знания проверяются на Экзамене 1 Сертификации профессионального института Linux.
Сравнение интерактивного входа в систему и неинтерактивной пакетной оболочки
Как правило, оболочка имеет два режима работы. Он может работать как интерактивная оболочка входа в систему и как неинтерактивная пакетная оболочка. Режим работы определяет запуск Bash и то, какие файлы конфигурации читаются. Режим работы можно различать следующим образом – интерактивная оболочка входа в систему, интерактивная оболочка без входа в систему, неинтерактивная оболочка входа в систему и неинтерактивная (пакетная) оболочка без входа в систему.
Проще говоря, интерактивная оболочка читает и записывает в пользовательский терминал. Напротив, неинтерактивная оболочка не связана с терминалом, как при выполнении сценария пакетной оболочки. Интерактивная оболочка может быть как оболочкой входа, так и оболочкой без входа.
Интерактивная оболочка входа
Этот режим относится к входу в ваш компьютер на локальном компьютере с использованием терминала от tty1 до tty4 (в зависимости от вашей установки – терминалов может быть больше или меньше). Кроме того, этот режим охватывает удаленный вход в компьютер, например, через Secure Shell (ssh) следующим образом:
$ ssh user@remote-system $ ssh user@remote-system remote-command
Первая команда подключается к удаленной системе и открывает только интерактивную оболочку. Напротив, вторая команда подключается к удаленной системе, выполняет данную команду в неинтерактивной оболочке входа в систему и завершает соединение ssh. Пример ниже показывает это более подробно:
$ ssh localhost uptime user@localhost's password: 11:58:49 up 23 days, 11:41, 6 users, load average: 0,10, 0,14, 0,20 $
Чтобы узнать, вошли ли вы в свой компьютер с помощью оболочки входа, введите следующую команду echo в своем терминале:
$ echo $0 -bash $
Для оболочки входа в систему вывод начинается со знака «-», за которым следует имя оболочки, что в нашем случае дает «-bash». Для оболочки без входа в систему выводом является просто имя оболочки. В приведенном ниже примере это показано для двух команд echo $0, а время работы передается ssh в виде строкового параметра:
$ ssh localhost "echo $0; uptime" user@localhost's password: bash 11:58:49 up 23 days, 11:41, 6 users, load average: 0,10, 0,14, 0,20 $
В качестве альтернативы используйте встроенную команду shopt следующим образом:
$ shopt login_shell login_shell off $
Для оболочки без входа в систему команда возвращает «off», а для оболочки входа – «on».
Что касается конфигурации для этого типа оболочки, учитываются три файла. Это /etc/profile, ~/.profile и ~/.bash_profile.
Интерактивная оболочка без входа в систему
Этот режим описывает открытие нового терминала, например xterm или Gnome Terminal, и выполнение в нем оболочки. В этом режиме читаются два файла /etc/bashrc и ~/.bashrc.
Неинтерактивная оболочка без входа в систему
Этот режим используется при выполнении сценария оболочки. Сценарий оболочки запускается в собственной подоболочке. Он классифицируется как неинтерактивный, если не требует ввода данных пользователем. Оболочка открывается только для выполнения сценария и сразу же закрывает его после завершения сценария.
. /local-script.sh
Неинтерактивная оболочка входа
Этот режим охватывает вход в компьютер с удаленного компьютера, например, через Secure Shell (ssh). Сценарий оболочки local-script.sh сначала запускается локально, а его выходные данные используются как входные данные для ssh.
./local-script.sh | ssh user@remote-system
Запуск ssh без дополнительных команд запускает оболочку входа в систему в удаленной системе. Если устройство ввода (stdin) ssh не является терминальным, ssh запускает неинтерактивную оболочку и интерпретирует вывод сценария как команды, которые должны выполняться в удаленной системе. В приведенном ниже примере выполняется команда uptime в удаленной системе:
$ echo "uptime" | ssh localhost Pseudo-terminal will not be allocated because stdin is not a terminal. frank@localhost's password: The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. You have new mail. 11:58:49 up 23 days, 11:41, 6 users, load average: 0,10, 0,14, 0,20 $
Интересно, что ssh жалуется на то, что stdin не является терминалом, и показывает сообщение дня (motd), которое хранится в глобальном файле конфигурации /etc/motd. Чтобы сократить вывод терминала, добавьте параметр «sh» в качестве параметра команды ssh, как показано ниже. В результате сначала открывается оболочка, и сначала выполняются две команды без отображения motd.
$ echo "uptime" | ssh localhost sh frank@localhost's password: 12:03:39 up 23 days, 11:46, 6 users, load average: 0,07, 0,09, 0,16 $$
Далее мы рассмотрим различные файлы конфигурации для Bash.
Файлы запуска Bash
Различные режимы Bash определяют, какие файлы конфигурации читаются при запуске:
- интерактивная оболочка входа
- /etc/profile: если он существует, он выполняет команды, перечисленные в файле.
- ~/.bash_profile, ~/.bash_login и ~/.profile (в указанном порядке). Он выполняет команды из первого читаемого файла, найденного в списке. У каждого отдельного пользователя может быть свой набор этих файлов.
- интерактивная оболочка без входа в систему
- /etc/bash.bashrc: глобальная конфигурация Bash. Он выполняет команды, если этот файл существует и доступен для чтения. Доступно только в Debian GNU/Linux, Ubuntu и Arch Linux.
- ~/.bashrc: локальная конфигурация Bash. Он выполняет команды, если этот файл существует и доступен для чтения.
Может быть полезно увидеть это в виде графика. В ходе исследования мы нашли картинку ниже, которая нам очень понравилась.
изображение : config-path.png
текст: Процесс оценки конфигурации Bash
Объяснение различных файлов конфигурации
Для файлов, описанных ниже, не существует общего набора правил, определяющего, какой параметр хранить в каком файле (кроме глобальных параметров и локальных параметров). Более того, порядок чтения файлов конфигурации разработан с учетом гибкости, так что смена используемой оболочки гарантирует, что вы все еще можете использовать свою систему Linux. Вот почему используются несколько файлов, которые настраивают одно и то же.
/etc/profile
Этот файл используется оболочкой Bourne (sh), а также оболочками, совместимыми с Bourne, такими как Bash, Ash и Ksh. Он содержит записи по умолчанию для переменных среды для всех пользователей, которые входят в систему в интерактивном режиме. Например, это влияет на $PATH и дизайн приглашения для обычных пользователей, а также пользователя с именем «root». В приведенном ниже примере показана часть /etc/profile из Debian GNU/Linux.
setuserpath(){ # Общие каталоги для исполняемых файлов для всех пользователей PATH="/usr/local/bin:/usr/bin:/bin" # Тест для корневого пользователя для добавления в программы системного администрирования if [ "`id -u`" -eq 0 ]; then PATH="/usr/local/sbin:/usr/sbin:/sbin:$PATH" else PATH="/usr/local/games:/usr/games:$PATH" fi export PATH } setuserpath() # PS1-это основная строка командной строки if [ "$PS1" ]; then if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then # Файл bash.bashrc уже устанавливает PS1 по умолчанию. # PS1='\h:\w\$ ' if [ -f /etc/bash.bashrc ]; then . /etc/bash.bashrc fi else if [ "`id -u`" -eq 0 ]; then PS1='# ' else PS1='$ ' fi fi fi
Другие файлы конфигурации можно сохранить в каталоге /etc/profile.d. Они загружаются в конфигурацию Bash, как только читается /etc/profile.
~/.bash_profile
Этот локальный файл конфигурации считывается и выполняется, когда Bash вызывается как интерактивная оболочка входа. Он содержит команды, которые следует запускать только один раз, например настройку переменной среды $PATH.
Очень часто ~/.bash_profile заполняют строками, как показано ниже, которые являются источником файла .bashrc. Это означает, что каждый раз, когда вы входите в терминал, читается содержимое вашей локальной конфигурации Bash.
if [ -f ~/.bashrc ]; then . ~/.bashrc fi
Если файл ~/.bash_profile существует, то Bash пропустит чтение из ~/.bash_login (или ~/.profile).
~/.bash_login
Два файла ~/.bash_profile и ~/.bash_login аналогичны.
~/.profile
Большинство дистрибутивов Linux используют этот файл вместо ~/.bash_profile. Он используется для поиска локального файла .bashrc и расширения переменной $PATH.
# при запуске bash if [ -n "$BASH_VERSION" ]; then # include .bashrc, если он существует if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi # установить PATH, чтобы он включал личную корзину пользователя, если она существует if [ -d "$HOME/bin" ] ; then PATH="$HOME/bin:$PATH" fi
Как правило, ~/.profile читается всеми оболочками. Если существует ~/.bash_profile или ~/.bash_login, Bash не будет читать этот файл.
/etc/bash.bashrc и ~/.bashrc
Этот файл содержит конфигурацию Bash и обрабатывает локальные псевдонимы, ограничения истории, хранящиеся в .bash_history (см. Ниже), и завершение Bash.
# не помещайте в историю повторяющиеся строки или строки, начинающиеся с пробела. # Дополнительные параметры см. В bash (1) HISTCONTROL=ignoreboth # добавьте к файлу истории, не перезаписывайте его shopt -s histappend # для установки длины истории см. HISTSIZE и HISTFILESIZE в bash(1) HISTSIZE=1000 HISTFILESIZE=2000
Что настраивать в каком файле
Как вы уже узнали, для настройки Bash существует не один файл, а группа файлов. Эти файлы существуют просто по историческим причинам – особенно из-за того, как разные оболочки развивались и заимствовали полезные функции друг у друга. Кроме того, нет никаких строгих правил, которые
определить, какой файл предназначен для хранения определенной части настройки. Вот рекомендации, которые у нас есть для вас (на основе TLDP):
- Все настройки, которые вы хотите применить ко всем средам ваших пользователей, должны быть в /etc/profile.
- Все глобальные псевдонимы и функции должны храниться в /etc/bashrc.
- Файл ~/.bash_profile является предпочтительным файлом конфигурации для индивидуальной настройки пользовательских сред. В этом файле пользователи могут добавлять дополнительные параметры конфигурации или изменять настройки по умолчанию.
- Все локальные псевдонимы и функции должны храниться в ~/.bashrc.
Также имейте в виду, что Linux спроектирован таким образом, чтобы быть очень гибким: если какой-либо из файлов запуска, упомянутых выше, отсутствует в вашей системе, вы можете его создать.