Работа в командной оболочке Bash


Большинство пользователей компьютеров не интересуются, каким образом компьютер выполняет свою работу. Например, когда пользователь посещает Web-страницы, посылает и получает электронные письма, он взаимодействует с компьютером на очень высоком уровне. Программное обеспечение, которое изолирует пользователя от низкоуровневых деталей, известно как операционная система. Операционная система имеет специальный компонент, называемый ядром, который и взаимодействует напрямую с аппаратным обеспечением компьютера.

Для упрощения часто выполняемых на компьютерах задач поверх операционной системы с течением времени надстраивались графические интерфейсы типа Microsoft® Windows®, K Desktop Environment (KDE), GNU Network Object Model Environment (GNOME), Aqua от Apple и X11 от X Consortium. Однако так было не всегда. До того, как оконные системы завоевали популярность, пользователи компьютеров работали в командной строке, напрямую взаимодействуя с ядром при выполнении своей работы. Так как такой путь был труден и часто приводил к ошибкам, было разработано программное обеспечение промежуточного уровня, называемое командной оболочкой, которое упрощало работу по взаимодействию с ядром операционной системы.

Краткая история командных оболочек UNIX

Автором первой широко распространенной командной оболочки был Стивен Борн (Stephen R. Bourne) из AT&T Bell Labs, создавший свою программу в 1974 году и назвавший ее Bourne shell. Эта командная оболочка была написана для того, чтобы упростить взаимодействие пользователя с версией UNIX Seventh Edition от Bell Labs Research. Bourne shell предоставляет язык программирования, позволяющий пользователю контролировать входные и выходные потоки программы и содержащий мощные поисковые возможности.

Примерно в то же время в Университете штата Калифорния в Беркли (University of California, Berkeley) разрабатывалась альтернативная реализация UNIX, получившая известность как BSD UNIX (BSD — Berkeley Software Distribution). В 1978 году Билл Джой (Bill Joy) также в Беркли разработал новую командную оболочку UNIX, названную C Shell (/bin/csh), которая имела дополнительную функциональность, включая контроль заданий, псевдонимы и улучшенные возможности по взаимодействию с пользователем. Вдобавок средства программирования в C Shell были приближены к языку программирования C. Однако некоторые из этих изменений усложнили разработку и поддержку сценариев командной оболочки.

Впоследствии были разработаны и другие командные оболочки, в том числе Korn shell (/bin/ksh) и TC shell (/bin/tcsh) — расширения оригинальных Bourne shell и C Shell соответственно. Несмотря на ряд улучшений, обе эти командные оболочки имели и свои недостатки. Korn shell распространялась изначально с закрытыми исходными кодами, а TC shell сохранила многие сложности при написании сценариев, свойственные C Shell. Вскоре была разработана международная спецификация, известная как POSIX (Portable Operating System Interface) 1003.2, которая указывала, каким образом командная оболочка должна взаимодействовать с пользователем.

Командная оболочка Bash (/bin/bash), название которой является сокращением от Bourne-Again SHell, была первоначально разработана Брайаном Фоксом (Brian Fox) из Free Software Foundation; цель разработки состояла в том, чтобы преодолеть ограничения предыдущих оболочек. Продолжая традиции Bourne shell, Bash предоставляет следующие преимущества:

  • Мощный и простой в использовании язык сценариев.
  • Преимущества интерактивного взаимодействия, заимствованные из семейства командных оболочек C Shell.
  • Свобода распространения и полностью открытые исходные коды.
  • Полная реализация спецификации POSIX 1003.2.

Особенности Bash

Благодаря богатой истории развития Bash предоставляет ряд полезных особенностей, которые улучшают взаимодействие пользователя с командной оболочкой и упрощают разработку сценариев — простых программ, автоматизирующих пользовательские задачи. Bash легко настраивается — как через специальные файлы инициализации, так и через опции настройки. В Таблице 1 представлены некоторые из основных особенностей, которые расширяют возможности взаимодействия с Bash.

Таблица 1. Основные особенности командной оболочки Bash

Особенности Описание
Редактирование в командной строке Позволяет легко перемещать курсор и редактировать текст команды.
История команд Дает возможность повторить или при необходимости изменить команду, которая была введена в командной строке ранее.
Перенаправление ввода-вывода Позволяет легко указать команде, откуда брать входные данные и куда направлять выходные данные.
Псевдонимы Позволяет создавать краткие обозначения для однострочных команд.
Функции Позволяет создавать сокращения для многострочных команд.

Bash предоставляет множество других полезных возможностей по упрощению разработки и поддержки сценариев командной оболочки, однако описание этих возможностей не входит в это руководство.

Работа в командной строке Bash

Bash — это программа, которая работает в терминале UNIX. Следовательно, чтобы начать работу с Bash, необходимо запустить новый терминал. Система изначально может быть настроена на работу по умолчанию с другой командной оболочкой. Чтобы узнать, какая командная оболочка в действительности запущена, нужно набрать echo $SHELL в командной строке терминала и затем нажать клавишу Enter. Если в ответ будет выведено /bin/bash, то запущенной командной оболочкой является Bash. Если получен другой ответ от системы, значит, используется другая командная оболочка.

Чтобы узнать, установлена ли Bash в системе, можно ввести whereis bash в командной строке. Эта команда находит Bash и выводит полный путь к программе. Если Bash не установлена в системе, можно свободно скачать и установить ее новейшую версию. Если Bash установлена в системе, можно изменить запускаемую по умолчанию командную оболочку на Bash, введя команду chsh bash. Необходимо отметить, что в некоторых системах, таких как MAC OS X, написание команды может быть немного другим. Запустить командную оболочку Bash можно также (если Bash установлена в системе, даже если уже запущена другая командная оболочка), введя bash в командной строке и нажав Enter.

Работа в командной оболочке

Когда Bash запущена, очень просто настроить различные опции ее использования. Чтобы увидеть список опций настроек, необходимо ввести команду set -o в командной строке Bash, как показано в листинге 1. Необходимо заметить, что в этом листинге строка приглашения Bash выглядит как rb$. Строка приглашения в различных системах может различаться. Как изменить строку приглашения, будет рассказано позже в этом руководстве.

Листинг 1. Просмотр опций Bash

                    
rb$ echo $SHELL
/bin/bash
rb$ whereis bash
/bin/bash
rb$ set -o
allexport off
braceexpand on
emacs on
errexit off
hashall on
histexpand on
history on
ignoreeof off
interactive-comments on
keyword off
monitor on
noclobber off
noexec off
noglob off
nolog off
notify off
nounset off
onecmd off
physical off
posix off
privileged off
verbose off
vi off
xtrace off

Как видно из этого примера, Bash имеет много опций, позволяющих настраивать взаимодействие с пользователем. Среди наиболее полезных настроек — опции emacs и history. Первая позволяет настроить использование сочетаний клавиш Emacs для работы в командной строке, а вторая приказывает командной оболочке вести историю ранее выполненных команд, что позволяет легко их повторять.

Сочетания клавиш Emacs могут быть незнакомы пользователям, никогда не использовавшим редактор Emacs (или XEmacs). Однако они просты и дают большие возможности по перемещению в длинных командах. Вот некоторые из наиболее популярных сочетаний клавиш:

  • CTRL+A передвигает курсор в начало текущей строки.
  • CTRL+E передвигает курсор в конец текущей строки.
  • CTRL+K удаляет все символы, находящиеся за курсором в текущей строке.

Использование этих (и других аналогичных) клавиатурных сочетаний может значительно облегчить процесс создания команд. Включение опции history, в свою очередь, позволяет упростить редактирование и повторный вызов ранее набранных команд. По умолчанию при инсталляции Bash запись истории включает в себя 500 последних выполненных команд, чего достаточно в большинстве случаев. Однако если этого количества команд не хватает, можно просто изменить число запоминаемых команд — дальше будет рассказано, как это сделать. Для перемещения по истории команд можно использовать следующие сочетания клавиш:

  • CTRL+P (previous — предыдущая) или нажатие клавиши "вверх" — переход к предыдущей команде в истории команд.
  • CTRL+N (next — следующая), или клавиша "вниз" — переход к следующей команде в истории команд.
  • CTRL+R (reverse — обратный поиск) — поиск предыдущей команды.

Командой history также можно вывести список ранее набранных команд, содержащихся в буфере истории, с их порядковыми номерами. Затем можно вызывать эти команды по номерам, предваряя номер восклицательным знаком (!), например, !382. Можно также обращаться к командам из истории, выполняя относительные запросы, указывая восклицательный знак, за которым следует отрицательное число. Например, !-2 выполняет вторую с конца команду в истории команд. Так как буфер истории может распространяться на все сеансы работы, он представляет собой мощное средство для повторного вызова команд.

В листинге 1 есть и другие опции настройки; некоторые из них могут иметь отличия (или иметь другие значения по умолчанию) в зависимости от конкретной версии командной оболочки Bash. Значения этих опций можно легко менять, введя команду set -o option-name для включения опции или команду set +o option-name для выключения опции. Например, set -o emacs включает использование клавиатурных сочетаний Emacs.

   

Чтение руководства

Чтобы узнать больше об опциях Bash или любой команды UNIX-систем, можно использовать интерактивное руководство UNIX. Для доступа к нему нужно ввести команду man. В листинге 2 показана страница руководства по Bash.

Листинг 2. UNIX man для Bash

                    
rb$ man bash
BASH(1) BASH(1)

NAME
bash - GNU Bourne-Again SHell

SYNOPSIS
bash [options] [file]

COPYRIGHT
Bash is Copyright (C) 1989-2004 by the Free Software Foundation, Inc.

DESCRIPTION
Bash is an sh-compatible command language interpreter that executes
commands read from the standard input or from a file. Bash also
incorporates useful features from the Korn and C shells (ksh and csh).

Bash is intended to be a conformant implementation of the IEEE POSIX
Shell and Tools specification (IEEE Working Group 1003.2).

OPTIONS
In addition to the single-character shell options documented in the
description of the set builtin command, bash interprets the following
options when it is invoked:
:

 

Работа с файлами и каталогами в Bash

Большая часть работы, производимая в Bash, связана с файловой системой UNIX. Каждый, кто когда-либо использовал менеджер файлов, наверняка представляет себе файловую систему как дерево. То же самое верно и для командной строки. Все файлы и каталоги берут свое начало из каталога /, являющегося корневым узлом всей файловой системы. В таблице 2 приводится список стандартных каталогов, которые имеются в большинстве UNIX-систем.

Таблица 2. Стандартные каталоги UNIX-систем

Каталог Расписание
/ Корневой каталог для всех UNIX-систем; содержит все остальные файлы.
/bin Содержит бинарные версии файлов системных приложений, таких как файл самой командной оболочки Bash.
/dev Каталог содержит псевдофайлы, представляющие физические устройства, такие как жесткие диски.
/etc В этом каталоге хранится большая часть конфигурационных файлов системы.
/lib Каталог содержит файлы библиотек, необходимых для системных приложений.
/opt Каталог содержит необязательные компоненты системы или приложения.
/tmp Каталог содержит временные файлы, используемые системой или пользовательскими приложениями.
/usr Содержит пользовательские и некритичные для работы системы приложения и связанные компоненты.
/var Каталог содержит различные файлы, необходимые для системных приложений, такие как файлы журналов и файлы буферов.

   

Работа с каталогами в Bash

В UNIX есть несколько команд, которые позволяют легко создавать, просматривать, удалять каталоги и изменять текущий рабочий каталог:

  • cd cизменяет текущий рабочий каталог на домашний каталог пользователя.
  • cd dirname изменяет текущий рабочий каталог на каталог dirname.
  • ls dirname выводит список содержимого каталога dirname.
  • mkdir dirname создает новый каталог с именем dirname.
  • pwd выводит полный путь к текущему рабочему каталогу.
  • rmdir dirname удаляет каталог с именем dirname.

Чтобы выполнить любую из этих команд, нужно просто набрать команду в командной строке Bash (включая необходимое имя каталога) и нажать клавишу Enter.

Есть также несколько полезных сокращений для имен каталогов:

  • Одиночная точка (.) обозначает текущий рабочий каталог.
  • Две точки (..) обозначают родительский каталог текущего рабочего.
  • Тильда (~) обозначает домашний каталог пользователя (обычно это каталог, который является текущим рабочим при запуске Bash).

В листинге 3 показано, насколько просто использовать эти команды.

Листинг 3. Работа с каталогами в Bash

                    
rb$ pwd
/home/rb
rb$ mkdir temp
rb$ cd temp
rb$ ls
rb$ cd ..
rb$ pwd
/home/rb
rb$ rmdir temp
rb$ ls ..
lost+found rb root
rb$ ls /
bin etc lib misc proc usr
boot home lost+found mnt tmp var
dev initrd opt sbin sys

Команды, выполняемые в предыдущем листинге, достаточно просты. Первая из них выводит на экран путь к текущему рабочему каталогу. Следующими командами создается новый каталог с именем temp, рабочий каталог изменяется на созданный, выводится содержимое этого каталога (на экран не выводится ничего, поскольку каталог пуст). Затем рабочий каталог изменяется на родительский, проверяется, что он совпадает с тем, с которого была начата работа, и только что созданный каталог удаляется. Наконец, выводится содержимое родительского для домашнего каталога пользователя (то есть каталога /home) и содержимое корневого каталога файловой системы.

   

Работа с файлами в Bash

При работе в Bash можно использовать множество команд, которые работают напрямую с файлами. Полный список таких команд весьма обширен, но вот некоторые наиболее полезные:

  • cp file1 file2 копирует file1 в file2.
  • mv file1 file2 переименовывает file1 в file2.
  • mv filename dirname перемещает файл filename в каталог dirname .
  • less filename отображает содержимое файла в формате, удобном для чтения в окне терминала.
  • file filename указывает наиболее вероятный тип файла
  • cat filename выводит все содержимое файла.
  • head filename отображает первые десять строк файла (точное число отображаемых строк можно задавать).
  • tail filename отображает последние десять строк файла (точное число отображаемых строк можно задавать).
  • diff file1 file2 отображает различия, если они существуют, между файлами file1 и file2.
  • grep string filename ищет в файле строки, содержащие string.
  • rm filename удаляет файл.

В листинге 4 демонстрируется, насколько просто использовать представленные в списке команды. Начинающим пользователям полезно запустить терминал и попробовать эти команды в действии. Нужно помнить, что полная информация по работе программ содержится в руководствах man. Например, набрав команду man cp, можно прочитать соответствующую страницу руководства по команде копирования.

Листинг 4. Работа с файлами в Bash

                      
rb$ $ cp .bashrc old.bashrc
rb$ diff old.bashrc .bashrc
rb$ cat ~/.bash_profile
source ~/.bashrc
rb$ cat ~/.bashrc
export PS1='u$ '
export DERBY_INSTALL='/opt/Apache/db-derby-10.1.2.1-bin'
export CLASSPATH=$DERBY_INSTALL/lib/derby.jar:$DERBY_INSTALL/lib/derbytools.jar:.
rb$ head -4 /usr/share/dict/web2
A
a
aa
aal
rb$ tail -4 /usr/share/dict/web2
Zythia
zythum
Zyzomys
Zyzzogeton
rb$ grep exuberance /usr/share/dict/web2
exuberance
rb$ file bash-tutorial.zip
bash-tutorial.zip: Zip archive data, at least v2.0 to extract
rb$ file bash-tutorial.xml
bash-tutorial.xml: XML document text

Команды работы с файлами, представленные в листинге, просты и сопровождаются примерами копирования файлов, просмотра содержимого, поиска вхождения определенных строк и распознавания типа для различных файлов. Прежде всего с помощью команды копирования мы создаем дубликат файла .bashrc, который будет обсуждаться позже. Этот файл позволяет настраивать поведение и внешний вид командной оболочки Bash. Можно воспользоваться командой diff, чтобы убедиться, что эти файлы действительно одинаковы — а поскольку это так, никаких различий выведено не будет. Затем с помощью команды cat мы отображаем содержимое файлов .bash_profile и .bashrc. Содержимое этих двух файлов будет обсуждаться детально в следующем разделе.

В следующих двух примерах листинга с помощью команд head и tail выводятся первые и последние строки файла соответственно. Указанный в этих примерах флаг -4 задает вывод на экран только четырех строк вместо принятых по умолчанию десяти. Далее с помощью команды grep мы находим вхождения строки exuberance в словаре, установленном на компьютере. Наконец, в последних двух примерах с помощью команды file отображаются типы двух различных файлов.

Настройка Bash

Ранее в этом руководстве обсуждались настройки, изменяющие поведение командной оболочки Bash. Другой метод заключается в изменении переменных среды. Переменные среды можно использовать не только для настройки поведения Bash, но и для передачи информации командам, запускаемым из командной оболочки. В таблице 3 показан список некоторых наиболее распространенных переменных среды, значения которых можно изменить.

Таблица 3. Стандартные переменные среды Bash

Переменная Описание
BASH В переменной BASH содержится полный путь до исполняемого файла командной оболочки Bash.
BASH_VERSION В переменную BASH_VERSION записывается версия Bash.
CLASSPATH CLASSPATH содержит список каталогов для поиска файлов классов Java и архивов Java.
HOME HOME — это домашний каталог текущего пользователя.
HOSTNAME В переменной HOSTNAME хранится имя компьютера.
LANG LANG — это текущая установка локали, которая позволяет настроить командную оболочку для использования в различных странах и на различных языках.
OSTYPE В переменной OSTYPE содержится описание операционной системы.
PATH PATH — это список каталогов для поиска команд и приложений, когда полный путь к файлу не задан.
PS1 PS1 используется как основная строка приглашения.
PS2 PS2 используется как вторичная строка приглашения.
PROMPT_COMMAND Эта команда должна быть выполнена до отображения строки приглашения Bash.
PWD PWD — это полный путь к текущему рабочему каталогу.
SHELL SHELL — это полный путь к текущей командной оболочке.
USER В переменной USER содержится имя текущего пользователя.

Для отображения текущего значения переменной среды можно использовать команду echo так, как это было продемонстрировано ранее в этом руководстве, когда отображалось значение переменной SHELL. Для изменения значения переменной необходимо присвоить ей новое значение командой $varname=new-value, а затем экспортировать установленное значение в Bash командой export $varname. Изменение переменных среды необходимо производить с осторожностью. Если допустить ошибку, в лучшем случае вы получите неработающую командную оболочку. Как правило, пользователь изменяет только переменные PATH, PS1 и связанные с ними переменные среды, так как они используются для нахождения программ и их компонентов или для изменения поведения строки приглашения Bash.

   

Настройка строки приглашения Bash

Изменение строки приглашения Bash — в действительности более мощное средство, чем может показаться на первый взгляд. Можно не только изменить текст, который появляется в строке приглашения, но и текущее время, имя пользователя, имя компьютера, а также текущий каталог. Можно также изменить цвет фона и текста, который выводится в окне терминала.

Чтобы изменить вид строки приглашения, необходимо просто изменить значение переменной среды PS1. Чтобы приглашение командной строки выглядело как I am the Greatest!$ , нужно ввести команду PS1='I am the Greatest!$ ' и нажать Enter. Уже в этом простом примере следует отметить несколько моментов. Во-первых, необходимо заключать строку в кавычки. Во-вторых, нужно заканчивать строку символом пробела, чтобы набираемый в командной строке текст отделялся от приглашения командной строки. Это важно, когда необходимо просмотреть набранные ранее команды (и вывод этих команд) в окне терминала. Наконец, используется управляющая последовательность $, а не просто знак доллара. Это заставляет Bash отображать знак доллара ($), когда пользователь является обычным пользователем системы, но заменять знак доллара решеткой (#), когда пользователь является суперпользователем (root). Когда есть необходимость в администрировании компьютера, изменение вида значка играет важную роль, предупреждая об особой ответственности пользователя root.

Bash поддерживает ряд специальных управляющих последовательностей, которые упрощают настройку внешнего вида приглашения командной строки.  Наиболее популярны следующие управляющие последовательности:

  • u заменяется на имя текущего пользователя.
  • h заменяется на имя компьютера (вплоть до первой точки в DNS-имени).
  • w заменяется на текущий рабочий каталог (~ означает домашний каталог пользователя).
  • t заменяется на время в 24-часовом формате (HH:MM:SS).
  • A заменяется на время в 24-часовом формате (HH:MM).
  • e (управляющий символ в коде ASCII) передает окну терминала более сложные опции.
  • [ означает начало последовательности непечатаемых символов.
  • ] означает окончание последовательности непечатаемых символов.

Знание этих последовательностей помогает понять, каким образом модифицировать приглашение командной строки. Например, в моем файле .bashrc установлено значение PS1='u$ ', которое заменяется на rb$, так как все команды запускаются обычным пользователем с именем rb. Более сложный пример такой: PS1='[A][u@h:w]$ ', который заменяется, скажем, на такое значение: [14:14][rb@home:~]$, если текущее время составляет 2:14 после полудня, пользователь зашел на компьютер home под именем rb и работает в своем домашнем каталоге. Информация такого сорта может быть полезна, если вы работаете на нескольких компьютерах в разных окнах терминалов. Установив такие приглашения командной строки в каждой командной оболочке Bash, можно сразу видеть, какое окно соответствует какому компьютеру.

Другой хороший прием для быстрого получения информации — это использование цвета в качестве разделителя. Пользователи, которые долго работают в окне терминала и вынуждены возвращаться к выводу ранее запущенных команд, знают, насколько сложно разглядеть приглашение командной строки в символах одинакового цвета. К счастью, можно изменить цвет приглашения командной строки, что выделит его из обычного текста. Чтобы показать, что вводится значение цвета, необходимо ввести управляющую ASCII-последовательность e. Фактически эта управляющая последовательность используется всегда, когда необходимо передать в Bash непечатающуюся управляющую последовательность. Для цветов используется строка вида e[##m или e[##;##m, где символы ## обозначают специальный номер. Первая форма используется, когда устанавливается цвет текста или фона. Вторая форма используется, когда требуется установить цвет текста и использовать дополнительный код, говорящий специальных возможностях, таких как яркие цвета вместо светлых. Собирая все сказанное вместе, можно раскрасить предыдущее приглашение командной строки следующим образом: PS1='e[1;31m[A]e[1;34m[u@h:w]e[0m$ '. Результатом будет приглашение командной строки, которое отображает время ярко-красным цветом, а имя пользователя, имя компьютера и текущий рабочий каталог — ярко-синим цветом. Отметим установку цветового кода в ноль (который обозначает значение по умолчанию) в конце приглашения командной строки. Это позволяет легко отделить любую набранную команду или вывод команды от приглашения командной строки.

Одна из сложностей, возникающая при использовании таких управляющих последовательностей ASCII, состоит в том, что Bash вычисляет количество символов в приглашении командной строки и использует это число для размещения текста в терминальном окне. Так как коды цветов не выводятся на экран, то они мешают корректному подсчету. Чтобы предотвратить подсчет непечатаемых символов, управляющие последовательности необходимо заключать в управляющие скобки [ и ]. Иногда можно заключить в управляющие скобки несколько управляющих последовательностей, но хорошим тоном считается ставить управляющие скобки на каждую управляющую последовательность отдельно. Учитывая все это, можно модифицировать приглашение командной строки Bash следующим образом: PS1='[e[1;31m][A][e[1;34m][u@h:w][e[0m]$ '.

Полный список кодов цветов не входит в это руководство и зависит от типа используемого терминала. Вдобавок существуют другие управляющие последовательности, которые можно использовать для дальнейшей настройки вида и поведения окна терминала.

   

Использование файлов инициализации Bash

К сожалению, при перезапуске Bash все сделанные настройки сбрасываются. Однако существует несколько возможностей сохранить настройки между сеансами работы. При старте нового сеанса Bash (в общем случае это происходит, когда открывается окно терминала), считывается два файла настроек Bash. Первый из них, /etc/profile, позволяет администратору изменить настройки, влияющие на всю систему и применяющиеся к каждой запущенной пользователем командной оболочке. Второй файл, ~/.bash_profile или ~/.profile — это пользовательский файл настройки, который позволяет контролировать установки Bash на уровне пользователя. Необходимо помнить, что символ "тильда" обозначает домашний каталог пользователя. Если имя файла начинается с точки, то этот файл является скрытым, что усложняет его случайное удаление или перемещение. Поэтому многие системные конфигурационные файлы начинаются с точки.

Каждый раз при старте командной оболочки Bash (после того, как началась сессия работы командной оболочки) вместо файла ~/.bash_profile считывается , новый файл — ~/.bashrc. Чтобы не запутаться, рекомендуется сохранять все настройки (такие как настройки переменных среды) в файле ~/.bashrc file и включать этот файл в файл инициализации сессии. Это легко сделать, добавив строку source ~/.bashrc в конец файла ~/.bash_profile, как это показано в листинге 4. Существуют и другие возможности для изменения настроек, включая изменение строки приглашения Bash (изменением переменной среды PS1), изменение цветов, отображаемых терминалом и даже команды, которые должны быть выполнены при выходе из Bash (используя файл ~/.bash_logout).

Управление заданиями в Bash

Одна из наиболее мощных возможностей Bash — это возможность помочь пользователю в управлении исполнением различных команд. На рисунке 1 показана базовая модель исполнения команд в UNIX. В этой модели каждая команда имеет стандартный механизм для обработки ввода-вывода:

  • STDIN (стандартное устройство ввода) позволяет программе получать входные данные из командной оболочки.
  • STDOUT (стандартное устройство вывода) позволяет программе передавать свои выходные данные командной оболочке.
  • STDERR (стандартное устройство вывода ошибок) позволяет программе передавать командной оболочке информацию о возникающих ошибках.

Обычно STDIN — это клавиатура, с помощью которой передается информация команде (как это делается в строке приглашения Bash), а STDOUT и STDERR — это экран, на который выводятся результаты. Однако можно изменить этот механизм ввода-вывода, например, так, чтобы команда читала и записывала данные в файл.

Рисунок 1. Стандартное выполнение команды
Рисунок 1. Стандартное выполнение команды

Для изменения стандартного механизма ввода-вывода в Bash используются команды перенаправления, список которых представлен в таблице 4.

Таблица 4. Перенаправление ввода-вывода в Bash

Последовательность Описание
command < file command < file перенаправляет STDIN на чтение из файла.
command > file command > file перенаправляет STDOUT на запись в файл.
command >> file command >> file перенаправляет STDOUT на дозапись в файл.
command 2> file command 2> file перенаправляет STDERR на запись в файл..
command1 | command2 command1 | command2 connects STDOUT подсоединяет STDOUT команды command1 к STDIN команды command2.

Последний пункт в таблице 4 известен как конвейер и используется для объединения команд. Объединение команд с помощью конвейера — это ключевая техника программирования в командной оболочке UNIX, использующаяся, как продемонстрировано на рисунке 2. В этой модели каждая команда выполняет одну простую задачу и передает результат своей работы другой команде, которая также выполняет простую задачу, и так далее. Например, можно с помощью программы cat передать через конвейер содержимое файла команде grep, которая через конвейер передает все найденные строки команде wc, которая подсчитывает и выводит на экран количество строк в файле, содержащих заданную подстроку.

Рисунок 2. Объединение команд через конвейер
Рисунок 2. Объединение команд через конвейер

 

 

Асинхронное выполнение

Исполнение команд, которое описывалось выше, является синхронным, то есть в каждый момент времени выполняется только одна программа. Иногда команда или программа должна работать в течение долгого времени. Чтобы не отказываться от интерактивного использования, командной оболочки можно выполнять команды асинхронно. Для этого нужно дополнить команду знаком амперсанда (&). Это указывает командной оболочке запустить команду в фоновом режиме, что позволит продолжить работу в Bash. Листинг 5 демонстрирует эту и другие техники управления заданиями.

Листинг 5. Демонстрация управления заданиями в Bash

                    
rb$ grep paper.pdf /var/log/httpd/access.log | wc -l
5
rb$ python demo.py &
[1] 20451
rb$ jobs
[1]+ Running python demo.py &
rb$ fg 1
python demo.py

Листинг 5 демонстрирует две различные техники управления заданиями. В первом примере команда grep ищет строку paper.pdf в лог-файле Web-сервера Apache Web. Результат работы этой команды передается через конвейер команде wc -l, которая считает количество строк. Таким образом, целиком команда подсчитывает число строк, содержащих paper.pdf в лог-файле.

Во втором примере программа на языке Python запускается в фоне для долговременной работы. Bash запускает это задание асинхронно в фоне и указывает идентификатор задания. Используя команду jobs, можно просмотреть список всех запущенных команд. В этом примере запущена только одна программа, она выводится из фоновой работы в синхронное выполнение с помощью команды fg. В этом руководстве было рассказано только об основных возможностях Bash по управлению заданиями. Чтобы стать мастером командной строки, необходимо более подробно изучить эту область.

Заключение

В руководстве представлено базовое введение в работу в командной оболочке Bash. После обзора истории командных оболочек в UNIX и введения в основные возможности обсуждается несколько способов настройки среды Bash, включая установки опций, настройки переменных среды и приглашения командной строки. В руководстве также обсуждаются основные методы работы в командной строке и введение в основы управления заданиями в Bash.

 

Оставьте комментарий