Командная оболочка Shell
Интерактивная командная оболочка
Оболочки задают среду пользователя в системе Linux.
Bash — оболочка номер один в дистрибутивах GNU/Linux.
Первая задача, которую выполняет оболочка, — чтение и выполнение одного или нескольких файлов запуска.
Локальные файлы запуска ~/.bash_profile, ~/.profile, ~/.bash_login, ~/.bash_logout и ~/.bashrc
Глобальные файлы запуска /etc/profile, /etc/profile.d/*, /etc/bash.bashrc.
Локальные файлы настроек оболочки имеют приоритет над глобальными.
bash - Create a new shell.
su - Create a new shell.
sudo - Create a new shell
. Source a file
Под оболочкой понимается взаимодействие между пользователем и оболочкой: пользователь вводит команды в терминал с помощью клавиатуры, а оболочка выводит их на экран в виде сообщений.
Интерактивные оболочки для входа в систему запускаются при входе пользователей в систему и используются для настройки пользовательских конфигураций в соответствии с их потребностями. Хорошим примером такой оболочки может служить оболочка для группы пользователей из одного отдела, которым в сеансах работы требуется определенная переменная.
Под интерактивными оболочками без входа в систему мы подразумеваем любые другие оболочки, которые пользователь открывает после входа в систему. Пользователи используют эти оболочки во время сеансов для выполнения задач по обслуживанию и администрированию, таких как установка переменных, времени, копирование файлов, написание скриптов и т. д.
Неинтерактивные оболочки не требуют какого-либо взаимодействия с пользователем. Таким образом, эти оболочки не запрашивают у пользователя ввод данных, а их вывод — если он вообще есть — в большинстве случаев записывается в журнал.
Неинтерактивные оболочки для входа в систему встречаются довольно редко и непрактичны. Они практически не используются, и мы упомянем их только для того, чтобы лучше понять поведение оболочки. Среди необычных примеров — принудительный запуск скрипта из оболочки для входа в систему с помощью /bin/bash --login
<какая-то_команда> | ssh <какой-то_пользователь>@<какой-то_сервер>
Что касается неинтерактивной оболочки без входа в систему, то здесь не требуется ни взаимодействия, ни входа в систему от имени пользователя, поэтому мы имеем в виду использование автоматизированных скриптов. Такие скрипты в основном используются для выполнения повторяющихся административных задач и задач по обслуживанию, например тех, что входят в состав заданий cron. В таких случаях bash не считывает файлы запуска.
Ctrl+Alt+F1 - переход в сеанс tty
Ctrl+Alt+F7 - переход в сеанс графического интерфейса
#Узнать тип текущей оболочки
echo $0
-bash
#Узнать сколько bash оболочек запущено
ps aux | grep bash
user2 5270 0.1 0.1 25532 5664 pts/0 Ss 23:03 0:00 bash
user2 5411 0.3 0.1 25608 5268 tty1 S+ 23:03 0:00 -bash
Здесь на выходе видно интерактивную оболочку без входа в систему через эмулятор терминала (pts/0) и интерактивную оболочку с входом в систему через обычный текстовый терминал (tty1)
В первом случае — bash, а во втором — -bash
Interactive Login Shell
Конфигурация оболочки глобальная
Общесистемные или глобальные скрипты размещаются в каталоге /etc/, а локальные скрипты или скрипты на уровне пользователя — в домашней директории пользователя (~)
/etc/profile - это общесистемный файл .profile для оболочки Bourne и совместимых с ней оболочек (включая bash).
С помощью ряда операторов if этот файл соответствующим образом устанавливает ряд переменных, таких как PATH и PS1, а также подключает — если они существуют — файл /etc/bash.bashrc и файлы из каталога /etc/profile.d.
/etc/profile.d/* содержит скрипты, которые запускаются из файла /etc/profile
#id текущего пользователя
id -u
#Текущая командная оболочка
echo $BASH
#Перебор скриптов в каталоге /etc/profile.d
for i in /etc/profile.d/*.sh; do ....
#Сбросить переменную
unset i
Конфигурация оболочки локальная
~/.bash_profile - Этот специфичный для Bash файл используется для настройки пользовательской среды. Его также можно использовать для подключения файлов ~/.bash_login и ~/.profile
~/.bash_login - Этот файл, также специфичный для Bash, будет выполнен только в том случае, если отсутствует файл ~/.bash_profile. Судя по названию, он предназначен для выполнения команд, необходимых при входе в систему
~/.profile - Этот файл не связан с Bash и загружается только в том случае, если не существуют ни ~/.bash_profile, ни ~/.bash_login, что обычно и происходит.
Таким образом, основная задача файла ~/.profile — проверять, запущена ли оболочка Bash, и, если да, открывать файл ~/.bashrc, если он существует.
Обычно он устанавливает переменную PATH таким образом, чтобы в нее включался личный каталог пользователя ~/bin, если он существует.
~/.bash_logout - Если он существует, этот специфичный для Bash файл выполняет некоторые операции по очистке при выходе из оболочки. Это может быть удобно, например, при работе с удаленными сессиями.
# каждый из этих файлов будет прочитан и выполнен
echo 'echo Hello from /etc/profile' >> /etc/profile
echo 'echo Hello from ~/.profile' >> ~/.profile
#Например пользователь user2 входит в систему через ssh с другого компьютера
#После успешной авторизации пользователь увидит:
Hello from /etc/profile
Hello from /home/user2/.profile
Глобальный файл /etc/profile будет выполняться первым
Интерактивная оболочка без входа в систему
Interactive Non-Login Shell
Глобальный уровень
/etc/bash.bashrc - общесистемный файл .bashrc для интерактивных оболочек bash.
Локальный уровень
~/.bashrc - Помимо выполнения задач, аналогичных описанным для /etc/bash.bashrc на пользовательском уровне (например, проверка размера окна или интерактивного режима), этот специфичный для Bash файл обычно задает некоторые переменные истории и подключает файл ~/.bash_aliases, если он существует.
Кроме того, этот файл обычно используется для хранения пользовательских псевдонимов и функций.
~/.bashrc считывается, если bash определяет, что
echo 'echo Hello from /etc/bash.bashrc' >> /etc/bash.bashrc
echo 'echo Hello from ~/.bashrc' >> ~/.bashrc
#когда пользователь user2 запускает новую оболочку:
bash
Hello from /etc/bash.bashrc
Hello from /home/user2/.bashrc
Важно помнить, что из-за порядка запуска файлов локальные файлы имеют приоритет над глобальными.
Non-Interactive Login Shell
Неинтерактивная оболочка с параметрами -l или --login ведет себя как оболочка для входа в систему, поэтому запускаемые файлы будут такими же, как и для интерактивных оболочек для входа в систему
При выполнении скрипта с опцией -l bash -l ./test.sh, будет выполнен вход в систему, а также запущены /etc/profile и ~/.profile.
Перенаправим стандартный вывод (stdout) команды echo на стандартный ввод (stdin) ssh-соединения с помощью канала (|)
Псевдотерминал не будет выделен, поскольку stdin не является терминалом
Вернется ошибка:
-bash: line 1: Hello-from-a-noninteractive-login-shell: command not found
Опять же, запускаются /etc/profile и ~/.profile.
Non-Interactive Non-Login Shell
Скрипты не считывают ни один из перечисленных выше файлов, но ищут переменную среды BASH_ENV, при необходимости раскрывают ее значение и используют его в качестве имени запускаемого файла для чтения и выполнения команд.
Обратите внимание, что с помощью su - <имя пользователя> (а также su -l <имя пользователя> и su --login <имя пользователя>) мы гарантируем запуск оболочки для входа в систему, в то время как su <имя пользователя> запускает только /etc/bash.bashrc и ~/.bashrc.
Происхождение файлов запуска оболочки: SKEL
SKEL — это переменная, значение которой представляет собой абсолютный путь к каталогу skel. Этот каталог служит шаблоном для структуры файловой системы домашних каталогов пользователей.
Сюда входят файлы, которые будут унаследованы всеми вновь создаваемыми учетными записями пользователей
SKEL и другие связанные переменные хранятся в /etc/adduser.conf — файле конфигурации для adduser
/etc/adduser.conf
По умолчанию SKEL устанавливается в /etc/skel; таким образом, там находятся сценарии запуска, которые настраивают наши оболочки:
/etc/skel/
В /etc/skel можно создать каталог, в котором все новые пользователи смогут хранить свои личные скрипты:
mkdir my_personal_scripts
После создания нового пользователя скрипт будет автоматически создан в домашней директории
#Interactive-login shell as user2
#su
su - user2
su -l user2
#or
su --login user2
#sudo
sudo su - user2
sudo su -l user2
#or
sudo su --login user2
#Interactive non-login shell as root
#su
su root
#or
su
#sudo
sudo su root
sudo su
sudo -s
#or
sudo -u root -s
#Interactive non-login shell as user2
#su
su user2
#sudo
sudo su user2
#or
sudo -u user2 -s
Какой файл запуска считывается при запуске оболочки в разделе «Тип оболочки»?
Interactive login shell as user2 - /etc/profile /etc/bash.bashrc ~/.profile ~/.bashrc
Interactive login shell as root - /etc/profile /etc/bash.bashrc ~/.profile ~/.bashrc
Interactive non-login shell as root - /etc/bash.bashrc ~/.bashrc
Interactive non-login shell as user2 - /etc/bash.bashrc ~/.bashrc
Чтобы функция запускалась, когда пользователь root открывает новую интерактивную оболочку, независимо от того, входит он в систему или нет, можно использовать файл /etc/bash.bashrc. Данный файл выполняется для всех интерактивных оболочек — независимо от того, вошли вы в систему или нет.
#чтобы изменения в файле оболочки вступили в силу без перезагрузки
source .bashrc
#Или
. .bashrc
Источники
Связанные темы
Использование команды tee в Linux
Использование wget и curl в Linux
Команда chattr и lsattr в Linux
Использование awk Linux Alpine
Проверка на необходимость перезапуска после обновления пакетов
Стандартные потоки и перенаправление ввода/вывода в Linux
Архивирование и сжатие файлов в Linux
Полезные команды и скрипты Linux
Использование регулярных выражений в Linux
Условная конструкция if в Linux
Использование оператора select в языке shell
Внутренние и внешние команды linux
Использование конструкции case в Linux






