Информационные технологииStfw.Ru 🔍

Основы работы с интерпретатором команда bash

🕛 22.05.2009, 13:08
Назначение и настройка оболочки

Первая программа, с которой по существу начинается работа пользователя, - командная оболочка. В Linux реализуется следующий сценарий работы в системе: - При включении терминала активизируется процесс getty, который является сервером терминального доступа и запускает программу login, которая, в свою очередь, запрашивает у пользователя имя и пароль. - Если пользователь зарегистрирован в системе и ввел правильный пароль, login запускает программу, указанную в последнем поле записи пользователя в файле /etc/passwd. В принципе это может быть любая программа, но в нашем случае - это командный интерпретатор bash. - Командная оболочка выполняет соответствующий командный файл инициализации и выдает на терминал пользователя приглашение. C этого момента пользователь может вводить команды. - Оболочка считывает ввод пользователя, производит синтаксический анализ введенной строки, подстановку шаблонов и выполняет действие, предписанное пользователем (это может быть запуск программы, выполнение внутренней функции интерпретатора) или сообщает об ошибке, если программа или функция не найдены. - По окончании работы пользователь завершает работу с интерпретаторо, вводя команду exit, и выходит из системы.

Список задач, для решения которых предназначен интерпретатор команд:
- Выполнение команд - после ввода команды и нажатия клавиши Enter интерпретатор команд обрабатывает введенную последовательность, интерпретируя специальные символы. Затем он выполняет команду. Интерпретатор используется для запуска утилит и программ. Интерпретатор также может запускать встроенные утилиты - набор команд, которые могут использоваться всегда, когда интерпретатор запущен.
- Управление процессами - выполняемая программа называется процессом (process). Каждому процессу присваивается идентификационный номер, называемый идентификатором процесса (process ID). Интерпретатор позволяет управлять процессами различными способами. Вы можете запустить несколько процессов одновременно, задать режим фонового выполнения для процесса, приостановить работу процесса и, наконец, завершить работу процессов, "впавших в кому" и не отвечающих на запросы пользователя.
- Настройка сеанса работы - при входе в систему Linux запускает bash. В свою очередь, bash считывает настройки из файла .bash_profile в домашнем каталоге пользователя. Изменение содержимого этого файла позволяет настраивать внешний вид и функционирование bash.
- Создание сценариев (скриптов) - сценарием интерпретатора называется простая программа, содержащая различные команды Linux. Интерпретатор предоставляет широкие возможности по созданию сценариев, автоматизирующих выполнение задач, которые в противном случае были бы крайне утомительны.
Чтобы узнать, какой интерпретатор вы используете в данный момент, вы можете набрать echo $SHELL и нажать Enter - на экран будет выведено название интерпретатора.
Интерпретатор команд bash при запуске использует конфигурационные файлы, содержащие команды bash. Эти команды выполняются точно так же, как если бы они были введены с клавиатуры. Обычно используются следующие файлы (знак ~ обозначает ваш домашний каталог):
- /etc/profile. В этом файле хранится информация, предназначенная для всех пользователей системы. Данные параметры вступают в силу после первой регистрации пользователя в системе и запуска командной оболочки. В частности, в файле /etc/profile указываются значения для таких переменных окружения, как ящик электронной почты пользователя и размер истории команд.
- /etc/bashrc. В этом файле хранится информация, предназначенная для всех пользователей командной оболочки bash. Значения параметров файла /etc/bashrc вступают в силу при каждом запуске данной оболочки и определяют стандартное приглашение командной строки и др. Информация, хранящаяся в файле /etc/bashrc, может быть переопределена информацией, хранящейся в пользовательском файле ~/.bashrc.
- ~/.bash_profile. В этом файле хранится информация о настройках командной оболочки bash, специфичных для каждого конкретного пользователя. Параметры файла ~/.bash_profile вступают в силу только один раз после прохождения регистрации пользователя в системе. По умолчанию при этом определяется несколько переменных окружения и считывается информация пользовательского файла /bashrc.
- ~/.bashrc. В этом файле хранится информация, специфическая для оболочки bash каждого конкретного пользователя. Параметры файла ~/.bashrc вступают в силу не только сразу же после прохождения регистрации пользователя в системе, но и всякий раз при запуске командной оболочки. Это наиболее подходящее место для хранения значений переменных окружения и определения псевдонимов команд.
- ~/.bash_logout. Данный файл выполняется каждый раз при завершении сеанса работы с системой (выхода из последней командной оболочки). По умолчанию единственным действием, выполняемым при завершении сеанса работы с системой, является очистка экрана. Правом изменения файлов /etc/profile и /etc/bashrc обладает исключительно суперпользователь. Обычным же пользователям разрешается вносить коррективы только в файлы настроек ~/.bash_profile, ~/.bashrc и ~/.bash_logout, расположенные в их домашних каталогах.

Формат команд Linux
Под командой будем понимать последовательность слов, разделенных одним или несколькими пробелами. Первое слева слово определяет имя команды, которую следует выполнить. Команда может состоять из одного имени, например exit. За командой могут следовать параметры, как правило, им предшествует знак (дефис). Параметры команды часто состоят из одной буквы. Например, ls -l или, в случае нескольких параметров, ls -l -a. Если параметров несколько, то они могут быть объединены. Например, предыдущий пример может быть переписан в виде ls -la. За параметрами могут следовать аргументы, например, имена файлов: ls -la A*. Как правило, каждый аргумент состоит из одного слова. Аргумент может относиться как к самой команде, так и к отдельному параметру. Например, в команде awk -f AwkProg FileName аргумент AwkProg относится к параметру -f, а аргумент FileName - ко всей команде. Два дефиса подряд обозначают окончание списка параметров. Например, команда rm - -abc удалит файл с именем -abc. Если вы попробуете выдать команду rm -abc, то имя файла будет воспринято как параметр, и вы получите сообщение об ошибке. Наконец, еще одно значение знака - (дефис) состоит в том, что если знак используется на месте имени файла, то вместо файла используется стандартный ввод(или вывод).

Переменные окружения
При запуске командной оболочки происходит установка целого набора различных переменных окружения. Наиболее распространенные переменные окружения командной оболочки:
BASH Содержит полный путь к команде bash (как правило, значение этой переменной равно /bin/bash).
BASH_VERSION Номер версии bash.
DIRSTACK Массив, содержащий текущее значение стека каталога.
EUID Числовой эффективный идентификатор текущего пользователя.
GROUPS Массив, содержащий список групп, к которым принадлежит текущий пользователь.
HISTFILE Местоположение файла истории команд. Как правило, история команд хранится в файле ~/.bash_history.
HISTFILESIZE Число командных строк, которые могут храниться в файле истории.
После достижения этого числа новые командные строки заносятся в историю за счет удаления наиболее ранних командных строк. По умолчанию размер списка недавно использовавшихся команд равен 1000 строк.
HOME Домашний каталог пользователя.
HOSTNAME Имя данного компьютера (узла).
HOSTTYPE Тип компьютера.
LANG Текущий используемый по умолчанию язык.
MAIL Местоположения файла ящика электронной почты пользователя. Как правило, это файл, расположенный в каталоге /var/spool/mail, имя которого совпадает с регистрационным именем пользователя.
MAILCHECK Интервал в минутах между проверками почты.
OLDPWD Каталог, который являлся текущим до момента последнего изменения каталога.
OSTYPE Текущая операционная система.
PATH Разделенный символами двоеточия список каталогов, в которых производится поиск исполняемых файлов. Крайне важен порядок ледования имен каталогов. При выполнении команд перечисленные в этой переменной каталоги проверяются последовательно слева направо. Т.о., при выполнении команды foo, расположенной в каталогах /bin и /usr/bin, будет выполнена команда, расположенная в каталоге /bin. Для того чтобы в аналогичной ситуации была выполнена команда foo, расположенная в каталоге /usr/bin, следует либо указать полный путь к этой команде, либо
изменить порядок следования имен каталогов в переменной окружения PATH. Текущий каталог поиска должен быть задан явно ('.'), оболочка не производит поиск в текущем каталоге по умолчанию. Поиск запускаемых программ в текущем каталоге таит потенциальную опасность вследствие возможности непреднамеренного выполнения опасной программы, поэтому переменная PATH обычно инициализируется без '.' Для того, чтобы добавить к переменной PATH путь к своим собственным командам или сценариям оболочки, их следует разместить в подкаталоге /bin домашнего каталога, который будет автоматически занесен в переменную PATH. Не все исполняемые команды расположены в каталогах, перечисленных в переменной окружения PATH. Некоторые команды встроены непосредственно в оболочку. Другие команды могут быть переопределены с помощью псевдонимов, позволяющих заменить команды с параметрами практически любой сложности (с точки зрения синтаксиса) одним простым именем. Помимо этого, существует возможность создания функций, хранящих в себе целую последовательность команд.
PPID Идентификационный номер процесса, соответствующего команде, в результате выполнения которой была запущена текущая оболочка(например, процесс, породивший оболочку).
PS1 Переменные PS1 и PS2 устанавливают первичное и вторичное приглашение командного интерпретатора. Первичное приглашение указывает на готовность интерпретатора к вводу команд.
Значение этой переменной имеет вид "$" для обычных пользователей и "#" для суперпользователя. Вообще говоря, приглашение командной строки может содержать в себе достаточно большое количество разнообразных элементов (дату, время, регистрационное имя пользователя, сетевое имя компьютера и т.д.). Вид приглашения легко изменить, соответствующим образом задав значение переменной PS1. Вторичное приглашение появляется, если вы нажали клавишу Enter, синтаксически не закончив ввод команды.
PWD Текущий рабочий каталог пользователя. Это значение изменяется каждый раз при переходе в другой каталог с помощью команды cd.
SHELL Текущий интерпретатор команд.
SHELLOPTS Список включенных параметров интерпретатора.
SHLVL Число запусков новых копий интерпретатора команд.
UID Числовой идентификатор текущего пользователя.
USER Имя текущего пользователя.
Создание своих собственных переменных окружения

Переменные окружения представляют собой достаточно удобный способ хранения информации, часто используемой в пределах текущего сеанса работы с системой. При необходимости пользователь может создать практически любые переменные окружения (старайтесь не изменять значения переменных окружения, уже находящихся в использовании) и считывать их значения на протяжении всего времени работы с командной оболочкой. Для того чтобы создать временную переменную окружения, следует ввести ее имя и присвоить ему соответствующее значение. Например,
AB=/usr/dog/contagious/ringbearer/grind ; export AB

В данном примере временной переменной окружения AB присваивается путь к каталогу, расположенному достаточно "глубоко" в иерархии каталогов файловой системы. Команда export указывает на необходимость экспорта значения переменной АВ в оболочку, для того чтобы сделать его доступным для других оболочек, которые могут быть открыты в пределах текущего сеанса работы с системой. Теперь к указанному выше каталогу можно добраться посредством выполнения команды cd $AB Единственным недостатком временных переменных окружения является то, что они автоматически уничтожаются при завершении текущего сеанса работы с системой. Для того чтобы создать постоянную (в отличие от временной) переменную окружения, ее необходимо внести в файл настройки командной оболочки .bashrc. Важным моментом при создании временной переменной окружения является необходимость ее экспорта для использования порожденными оболочками и командами. Следует отметить, что команда export обладает достаточной гибкостью. Вместо выполнения этой команды непосредственно после создания переменной окружения можно воспользоваться следующей конструкцией:
export AB=/usr/dog/contagious/ringbearer/grind
Одной из наиболее часто изменяемых переменных окружения является переменная PATH. Ниже приведен пример временного добавления некоторого каталога к значению переменной окружения PATH: export PATH=$PATH:/home/xyz/bin
Для того чтобы уничтожить значение временной переменной окружения, следует воспользоваться командой unset. Так, выполнение команды unset AB приведет к уничтожению значения переменной окружения AB.

Настройка приглашения командной строки
Приглашение командной строки состоит из набора символов, отображаемых оболочкой как признак готовности обработать следующую команду. Внешний вид приглашения командной строки определяется значением переменной окружения PS1. Для настройки дополнительных приглашений командной строки используются переменные окружения PS2, PS3 и PS4. Непосредственно после установки Red Hat Linux стандартное приглашение командной строки всех пользователей системы включает в себя следующую информацию: регистрационное имя пользователя, сетевое имя компьютера и базовое имя текущего рабочего каталога. Эти сведения заключаются в квадратные скобки, после которых размещается либо символ доллара (для обычных пользователей), либо символ фунта (для суперпользователя). Существует несколько специальных символов (состоящих из прямой косой черты и буквы или знака), включение которых в приглашение командной строки способно повлиять на его внешний вид.

\! Номер текущей команды в истории. Список истории включает в себя команды, которые были выполнены пользователем с данным регистрационным именем (в т.ч. и во время предыдущих сеансов работы с системой).
\# Номер текущей команды. В данном случае нумерация команд ведется с начала текущего сеанса работы с системой.
\$ Стандартное приглашение на ввод команды в виде знака доллара ($) для обычного пользователя системы и знака диеза (#) для суперпользователя.
\W Базовое (последнее в полном пути) имя текущего рабочего каталога.
\\ Символ обратной косой черты
\d Текущая дата (день, месяц, число).
\h Сетевое имя кокпьютера, на котором выполняется командная оболочка.
\s Имя текущей оболочки.
\t Текущее время (часы, минуты, секунды).
\u Текущее регистрационное имя пользователя.
\w Полный путь к текущему рабочему каталогу.
В случае проведения временной настройки приглашения командной строки значение переменной окружения PS1 должно быть заключено в кавычки. Например,
export PS1="[\t \W]\$"


Подстановки и организация взаимодействия между командами

Подстановка значений переменных окружения
Подстановка значений переменных окружения текущего сеанса работы с системой может быть осуществлена с помощью использования метасимвола знака доллара ($). В результате оболочка автоматически заменяет имя переменной на ее значение. Например,
ls -l $BASH


Подстановка результата вычисления арифметического выражения
Существуют две синтаксические формы подстановки результата вычисления арифметического выражения: $[выражение] и $((выражение)). Например,
echo "I am $[2000-1957] years old."


Подстановка команд
Подстановка команд позволяет использовать вывод одной команды в командной строке, содержащей другую команду. Можно использовать два альтернативных формата подстановки: $(команда) или `команда`. Например,
ls $(pwd) ls `pwd`


Раскрытие символа тильды
Символ тильды позволяет быстро вводить названия каталогов.

~ Имя домашнего каталога пользователя
~/подкаталог Имя одного из подкаталогов в домашнем каталоге пользователя
~+ Имя текущего каталога
~- Имя предыдущего каталога


Раскрытие фигурных скобок
С помощью фигурных скобок можно вместо нескольких однотипных команд ввести одну. В скобках должен содержаться список, элементы которого должны быть разделены запятыми. Интерпретатор считывает элементы по одному и с каждым из них формирует отдельную команду, которую затем выполняет. Например, команда
mkdir expenses/{Jan,Feb,Mar}
эквивалентна mkdir expenses/Jan mkdir expenses/Feb mkdir expenses/Mar


Перенаправление ввода/вывода
Каждая запущенная из командного интерпретатора программа получает три открытых потока ввода/вывода:
- стандартный ввод
- стандартный вывод
- стандартный вывод ошибок По умолчанию эти потоки ассоциированы с терминалом. Т.е. любая программа, не использующая потоки, кроме стандартных, будет ожидать ввода с клавиатуры терминала, весь вывод этой программы, включая сообщения об ошибках, будет происходить на экран терминала. Большое число утилит используют только стандартные потоки. Для таких программ оболочка позволяет независимо перенаправлять потоки ввода/вывода. Например, можно подавить вывод сообщений
об ошибках, установить ввод или вывод из файла.
Синтаксис перенаправления ввода/вывода:
>file Перенаправление стандартного потока вывода в файл file
>>file Добавление в файл file данных из стандартного потока вывода
<file Получение стандартного потока ввода из файла file
n>file Переключение потока вывода из файла с дескриптором n в файл file
n>>file То же, но записи добавляются в файл file
n>&m Слияние потоков с дескрипторами n и m
<<str "Ввод здесь": используется стандартный поток ввода до подстроки str. При этом выполняются подстановки метасимволов камандного интерпретатора
<<\str То же, но подстановки не выполняются

Например, logger>>file.log
Вывод программы logger будет записываться в конец файла file.log, сохраняя все предыдущие записи.
Стандартным потокам ввода, вывода и вывода ошибок присваиваются дескрипторы - числовые значения, являющиеся указателями на соответствующий поток. Они, соответственно, равны 0, 1 и 2. Перенаправлять потоки можно, используя эти числовые значения.
Например, run 2>/dev/null
Подавление вывода ошибок. /dev/null - псевдоустройство, удаляющее все введенные в него символы.
Пример слияния потоков: run_long_program >/dev/null 2>&1
Сообщения об ошибках будут также выводиться в файл /dev/null. Символ & перед именем потока необходим, чтобы отличить его от файла с именем 1.

Каналы
Метасимвол канала (|) указывает на необходимость организации взаимодействия между командами путем использования в качестве входных данных (ввода) команды результата выполнения (вывода) другой команды. Другими словами, с помощью канала (конвейера) результаты первичной обработки данных могут быть переданы на дальнейшую обработку. Например, cat /etc/passwd | sort | more

Последовательности и группы команд
Использование последовательностей и групп команд позволяют ввести несколько команд на одной строке.

команда1;команда2 Выполнить сначала команду 1, затем команду 2
(команда1;команда2) Запустить отдельную копию интерпретатора, в которой выполнить последовательно команды 1 и 2
{ команда1;команда2 } Выполнить команды 1 и 2 последовательно в текущем интерпретаторе
команда1 && команда2 Выполнить команду 2 только в случае успешного выполнения команды 1
команда1 || команда2 Выполнить команду 2 только в случае неуспешного выполнения команды 1
Результатом выполнения любой команды (т.е. результатом завершения соответствующего процесса) является код завершения. Успешное завершение имеет код 0, неуспешное 1. Значение кода завершения присваивается предопределенной переменной ? (знак вопроса). Например, echo $?

Создание псевдонимов команд
Псевдонимы команд предназначены для обеспечения более эффективного ввода команд оболочки. Посредством псевдонима команда практически любой сложности может быть заменена произвольной строкой. Для того чтобы просмотреть список псевдонимов и, при необходимости, добавить в него новый псевдоним, следует воспользоваться командой alias. Например, alias p='pwd ; ls -CF' alias rm='rm -i' Для удаления определенного псевдонима используется команда unalias. Если псевдоним был создан в файле настройки, он будет автоматически восстановлен при открытии другой оболочки.



Повторное выполнение команд
Оболочка располагает средствами, позволяющими вызывать предыдущие команды и редактировать их. История (history) команд оболочки представляет собой список использовавшихся ранее команд. Этот список можно просмотреть с помощью команды history.
После ввода командной строки оболочка помещает ее в историю команд. Список ранее использовавшихся команд хранится в файле, который позволяет в любое время вызвать из него любую нужную командную строку для повторного выполнения. После повторного вызова командной строки она может быть отредактирована. История команд хранится в файле .bash_history, который
находится в домашнем каталоге пользователя. По умолчанию командная оболочка способна "запомнить" до 1000 командных строк. Для того чтобы посмотреть список ранее использовавшихся команд, выполните команду history. Она может употребляться либо без параметров, либо с параметром, позволюящим указать число отображаемых команд. Каждая командная строка имеет свой номер в истории команд.
Синтаксис раскрытия истории:
!n Выполнить команду с заданным номером
!! Выполнить предыдущую команду
!строка Выполнить самую последнюю из команд, начинающихся с заданной строки
!?строка? Выполнить самую последнюю из команд, содержащих заданную строку
Вместо того чтобы непосредственно выполнить командную строку, содержащуюся в истории команд, ее можно вызвать для последующего редактирования. Воспользуйтесь клавишами управления курсором "стрелка вверх" и "стрелка вниз" для пошагового просмотра истории команд и выбора требуемой командной строки.


Перечень команд

alias имя=команда
Задает альтернативное имя команды. Команда может содержать аргументы и параметры. Использование апострофов позволит обеспечить корректную обработку команды интерпретатором. При вводе команды alias без аргументов отображается список всех псевдонимов, которые были вами определены.

bash [имя файла]
Запуск интерпретатора команд bash. При указании имени файла интерпретатор будет осуществлять считывание команд из этого файла.

chsh [параметр] [имя пользователя]
Смена интерпретатора команд.
Параметры: -l Отображение списка доступных интерпретаторов -s интерпретатор Переключение на указанный интерпретатор

cut [параметры] [файл]
Позволяет отфильтровать указанные поля строк файла. Разделитель полей указывается опцией -d<sep>.

declare [параметры] [имя[=значение]]
Эта команда позволяет отобразить переменные и изменить их значения. При запуске без параметров и без аргументов выдает список всех имеющихся переменных вместе с их значениями. Для создания или изменения значения переменной следует указать ее имя и значение.

env [параметр] [переменная=значение] [команда]
Эта утилита позволяет отобразить или установить значение указанной переменной. При запуске без аргументов и параметров отображает все переменные вместе со значениями. Утилита позволяет также запускать произвольную команду в измененном окружении. С помощью параметра -u можно сбросить значение переменной.

export [параметр] [переменная] [имя[=значение]]
Делает указанную переменную доступной во всем текущем окружении bash. При запуске без аргументов команда отображает список переменных, экспортируемых интерпретатором в данный момент. Если переменная еще не создана, команда позволяет создать ее, указав имя и присвоив значение. По общепринятому соглашению названия экспортируемых переменных набираются заглавными буквами. Параметр -n отменяет экспорт переменной.

hash [параметр] [команда]
Создает запись местоположения для указанной команды, чтобы интерпретатору не приходилось производить поиск этой команды каждый раз при ее запуске. При запуске без параметров выводит список существующих записей. Параметр -r удаляет записи для данной команды.

history [параметр] [число строк]
Отображает пронумерованный список команд, которые вы выполняли в этом и предыдущих сеансах. Вы можете задать максимальное число строк в списке. Если список истории содержит больше команд, вы увидите только последние (самые недавние).

printenv [переменная]
При запуске без аргументов отображает значения всех переменных текущего окружения. Для получения информации о конкретной переменной следует указать ее имя.

readonly [переменная]
Делает указанную переменную доступной только для чтения. При запуске без аргументов отображает список всех переменных, доступных только для чтения.

script [параметр] [имя файла]
Утилита позволяет записывать весь вывод с терминала в файл. Если имя файла не указано, запись ведется в файл typescript. Чтобы остановить запись в файл, нажмите Ctrl-d. Параметр -а позволяет дописывать в конец файла.

sort файл
Сортирует строки файла в алфавитном порядке.

source [имя файла]
Считывает команды из текстового файла с заданным именем.

times
Показывает полное время выполнения процессов для всей системы и текущего пользователя.

type [параметры] [команда]
Отображение полного пути к данной команде и вывод информации о том, является ли команда хэшированной.
Параметры: -p Отображение хэшированного пути к указанной команде -t Тип указанного файла

unalias [параметр] [имя]
Удаление ранее созданного псевдонима. При использовании параметра -а без указания имени будут удалены все созданные вами псевдонимы.

Linux   Теги:

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉