Командная оболочка Shell

Оболочка — это, пожалуй, самый мощный инструмент в системе Linux. Ее можно определить как интерфейс между пользователем и ядром операционной системы. Она интерпретирует команды, вводимые пользователем.

    Интерактивная командная оболочка

    Оболочки задают среду пользователя в системе 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 или перенаправление стандартного вывода (stdout) команды на стандартный ввод (stdin) ssh-соединения.
    <какая-то_команда> | 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 определяет, что является сетевым подключением (как в случае с подключением по протоколу Secure Shell (SSH) в приведенном выше примере).

    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
    Источники
    Последнее изменение: 27.05.2026 16:10


    Связанные темы

    Команда exec linux

    Использование команды tee в Linux

    Язык shell в Linux

    Библиотеки Linux

    Использование md5sum

    Использование wget и curl в Linux

    Команда chattr и lsattr в Linux

    Использование awk Linux Alpine

    Использование sed в Linux

    Применение getopt в Linux

    Переменные окружения в Linux

    Классы символов в Linux

    Использование tar в Linux

    Подстановка имен файлов

    Проверка на необходимость перезапуска после обновления пакетов

    Стандартные потоки и перенаправление ввода/вывода в Linux

    Функции в языке Shell

    Использование grep в Linux

    Архивирование и сжатие файлов в Linux

    Использование find Linux

    Полезные команды и скрипты Linux

    Переменные в Linux

    Использование регулярных выражений в Linux

    Условная конструкция if в Linux

    Использование grep в Linux

    Использование xargs в Linux

    Фигурные скобки в bash

    Циклы в языке shell

    Использование оператора select в языке shell

    Внутренние и внешние команды linux

    Использование конструкции case в Linux

    Подстановка команд в Linux

    Мониторинг системы Linix с помощью getconf

    Использование ANCI последовательностей в Linux

    Здесь пока нет комментариев
    Добавлять комментарии могут только авторизованные пользователи

    Авторизоваться
    Я буду рекламой
    Я тоже буду рекламой
    И я
    ВВЕРХ